将流类型为SuperType的对象分配给SubType会导致错误

时间:2019-07-17 00:52:42

标签: javascript flowtype

我给人的印象是,只要存在已经声明过的所有属性,就可以向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;

1 个答案:

答案 0 :(得分:1)

否,nested object props are invariant by default。要进行协变,只需添加一个加号:

type SubType = {
  +plan: {
    id: string,
    +location: {
      id: string,
    },
  },
};

Try