假定此嵌套对象:
const nestedObj = {
definition: {
name: 'Mike',
prop1: {
value1: 'This is a string',
prop2: {
value2: 'String again',
},
},
},
};
是否有谨慎的方法来做类似的事情:
type NestedObj = {
definition: AllValuesAreOfTypeString
}
答案 0 :(得分:1)
您正在寻找this吗?
否则,通过编写您已经拥有的确切代码,您为nestedObj
指定了以下类型:
{
definition: {
name: string,
prop1: {
value1: string,
prop2: {
value2: string,
},
},
},
}
例如,如果您提取嵌套属性之一:
const nestedProp = nestedObj.definition.prop1.value1;
它将正确键入为string
:
(nestedProp: string);
如果您尝试将深度嵌套的属性设置为其他类型:
nestedObj.definition.prop1.value1 = 1;
您将收到类型错误:
由于数字[1]与字符串[2]不兼容,因此无法将
1
分配给nestedObj.definition.prop1.value1
。
您也不能在对象上设置其他道具,因为它是密封的:
nestedObj.undefinedProp = 'test';
最后,您实际上可以通过执行以下操作来保存nestedObj
的类型:
type NestObject = typeof nestedObj;
例如,您然后可以在其他对象上使用此类型:
const nestedObj2: NestedObject = {
definition: {
name: 'test',
prop1: {
value1: 'value1',
prop2: {
value2: 'test',
}
},
},
};
因此,如果您以与nestedObj2
不匹配的方式定义nestedObj1
,则会出现错误:
const nestedObj3: NestedObject = {
definition: {
name: 1, // Error!
// Cannot assign object literal to `nestedObj3` because
// number [1] is incompatible with string [2] in property
// `definition.name`.
prop1: {
value1: 'value1',
prop2: {
value2: 'test',
}
},
},
};
(Try Flow)
编辑:添加了第一个示例,因为我可能在第一次就误解了这个问题。