【问题标题】:TypeScript loop trough ObjectTypeScript 循环遍历对象
【发布时间】:2020-04-30 13:28:14
【问题描述】:

我有一个非常简单的问题,我想在 TypeScript 中循环一个对象。

const an_object = {
    one: 1,
    two: 2,
    three: 3
};

for (let key in an_object) {
    let value = an_object[key];
    // Do something with value
}

这一行 let value = an_object[key]; 导致 TypeScript 错误:

[react-scripts] 元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“{ one: number;二:号码;三:号码; }'。

我是 TypeScript 新手,不太了解问题所在。

这适用于 JavaScript,但不适用于 TypeScript。

关于如何在 TypeScript 中正确循环对象而不出错有什么建议吗?

【问题讨论】:

  • value 每次都会被覆盖,为什么需要这样?
  • @Lonely 很抱歉没有说得足够清楚,我更新了代码,以便您可以看到您对价值做了一些事情。
  • @AleksaSvitlica 我不会称它为重复,因为这个问题更短更清晰。这个问题的答案也回答了一个具体问题,而不是一个更普遍的问题,我在这里展示了。
  • 奇怪的是,我没有从 StackOverflow 那里得到正确答案,而是从我的朋友那里得到的。没有人回答我的问题,这就是为什么我决定自己回答这个问题。如果我错了,请纠正我。

标签: typescript


【解决方案1】:

TypeScript 被命名为 TYPEScript 是有原因的。

问题是没有指定对象内部的内容。

关于如何在 TypeScript 中正确循环对象而不出错有什么建议吗?

要正确执行此操作,您应该指定对象内部的内容。这可以通过以下方式完成:

  1. 创建界面
interface MyObjectsInterface {
    [key: string]: number;
}
  1. 将其分配给对象。
const an_object: MyObjectsInterface = {
    one: 1,
    two: 2,
    three: 3
};
  1. 现在您可以在 forloop 中使用该值
for (let key in an_object) {
    let value: number = an_object[key];
    // Do something with value
}

通过这种方式,您将始终知道对象内部的内容。

【讨论】:

    【解决方案2】:

    为此,我通常会编写一个辅助函数,以便我的“for each object property”循环可以编写如下:

    objForEach(an_object, (k, v) => {
        console.log('key', k, 'value', v);
    });
    

    实现如下。有用的是,通过使其通用化,参数kv 可以根据an_object 正确推断其类型:

    function objForEach<T>(obj: T, f: (k: keyof T, v: T[keyof T]) => void): void {
        for (let k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                f(k, obj[k]);
            }
        }
    }
    

    请注意,我使用hasOwnProperty 来检查该属性是否属于对象本身,而不是其原型链中的另一个对象(参见例如this question)。

    【讨论】:

    • 不错的功能!使用此函数,您无需知道对象内部的内容即可循环遍历它。
    猜你喜欢
    • 2021-08-27
    • 2020-06-09
    • 1970-01-01
    • 2017-06-12
    • 2015-10-31
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多