正在从Typescript中使用括号表示法的对象更新嵌套属性



假设我有这个接口和带有嵌套属性的对象:

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"
}

然而,在您的情况下,a2a的子级,因此首先需要访问a,然后访问a2,这就是为什么在您的案例中obj['a']['a2']可以工作的原因。但是,如果您仍然坚持使用a.a2,那么您可以使用理解该密钥的Lodash库。

https://lodash.com/docs/4.17.15#set

最新更新