我有以下示例对象
const example = {
a: "foo",
b: "bar",
c: 123,
d: "1",
e: "3",
f: false,
};
我还有另一个类似字典的函数,用于example
中的一些属性
const dictionary = {
d:{
"1": "good",
"2": "bad",
"3": "perfect",
"4": "terrible",
},
e:{
"1": "big",
"2": "small",
"3": "huge",
},
我需要的是迭代example
,查找dictionary
中存在的属性,并根据其值更新它,最后我得到了以下代码
example = {
a: "foo",
b: "bar",
c: 123,
d: "good",
e: "huge",
f: false
};
我试过这个
for (const field of Object.keys(dictionary)) {
if (field in example) {
Object.assign(example, { [field]: dictionary[field][example[field]] });
}
}
但我得到了很多索引错误
2条答案
按热度按时间smdnsysy1#
polhcujo2#
您的代码工作正常,但TypeScript抱怨了两次,这是有道理的。
首先它会抱怨
dictionary[field]
,根据field
的值,dictionary[field]
的类型是具有三个属性的对象或具有四个属性的对象(并且它可能具有更多值)。TypeScript无法检测dictionary[field]
的类型(因为可能的值不相交),并决定其类型为any
。接下来,example[field]
用作dictionary[field]
的属性名称,但any
没有属性。它还抱怨
example[field]
,因为同样无法确定其类型。根据field
的值,example[field]
的类型为number
、string
或boolean
。由于这些类型没有共同点,因此检测到的example[field]
的类型也为any
,并且不能用作属性名称。解决办法很简单:声明
example
和dictionary
的类型,以让TypeScript知道您希望从中获得什么。描述
dictionary
的类型很容易:描述
example
的类型也很容易......但这并没有停止TypeScript抱怨,它是正确的:
example[field]
用作dictionary[field]
的属性名称,但boolean
值不能用作索引;仅允许string
和number
作为属性名称。解决方案是显式声明
any
为存储在example
中的值的类型:这些类型允许TypeScript执行其代码分析。
上网查一下。