我给人的印象是,只要存在已经声明过的所有属性,就可以向Flow提供一个不精确的对象类型,而该对象的类型未声明。
Flow中不精确的对象类型声明表明“该对象可以具有这些属性中的任何一个,以及任何其他未指定的属性”。因此,应该可以为SubType类型的对象分配一个SuperType类型的对象,并且该对象仍然有效。
我在这里想念什么?
我相信这与嵌套对象类型有关,但是如果我不能修改genericPlan(SubType)上未声明的属性,那为什么要紧呢?
/* @flow */
type SuperType = {
plan: {
id: string,
location: {
id: string,
team: {
id: string,
},
},
},
};
type SubType = {
plan: {
id: string,
location: {
id: string,
},
},
};
const planWithTeam: SuperType = {
plan: {
id: '',
location: {
id: '',
team: {
id: '',
},
},
},
};
// The following throws this error:
// Cannot assign planWithTeam to genericPlan because property team is
// missing in SubType [1] but exists in SuperType [2] in property plan.location.
const genericPlan: SubType = planWithTeam;
答案 0 :(得分:1)
否,nested object props are invariant by default。要进行协变,只需添加一个加号:
type SubType = {
+plan: {
id: string,
+location: {
id: string,
},
},
};