假设我有这个接口和带有嵌套属性的对象:
interface Iobj {
a: { a2:string };
b: string;
}
const obj: Iobj = {
a:{
a2: "hello"
}
b: "world"
};
我有一个字符串,可以识别obj:中的属性
const prop = "a.a2"
// or
const prop = "b"
我试图用括号表示法更新obj
,但这些语句给出了错误Type 'string' is not assignable to type 'never'
。
obj[prop] = "newString";
obj[prop as keyof Iobj] = "newString";
似乎obj[prop]
没有被识别为有效。我在这里做错了什么?
问题是,对于obj['a.a2']
,Javascript希望obj
的定义如下:
obj = {
"a.a2": "hello"
}
然而,在您的情况下,a2
是a
的子级,因此首先需要访问a
,然后访问a2
,这就是为什么在您的案例中obj['a']['a2']
可以工作的原因。但是,如果您仍然坚持使用a.a2
,那么您可以使用理解该密钥的Lodash库。
https://lodash.com/docs/4.17.15#set