流程:通过扩展另一种类型来创建流类型

时间:2017-03-03 15:35:40

标签: javascript casting type-conversion flowtype

type someType = {
  keyOne: string,
  keyTwo: string,
};

type someOtherType = {
  keyOne: string,
  keyTwo: string,
  keyThree: string,
};

这两种类型都是包含keyOnekeyTwo的对象,唯一的区别是后者 extends 前者,附加键为keyThree

可以通过扩展someOtherType来构建someType流类型,而不是编写重复的代码吗?在我看来,我想到了ES6对象休息/传播,但我不确定如何在Flow中完成这样的事情。

谢谢!

2 个答案:

答案 0 :(得分:23)

您正在寻找的是intersection type。根据文件:

  

交集类型要求值为所有输入类型。

     

语法:Intersection:&lt;类型1&gt; &安培; &LT; <类型2> ......&amp; &LT;输入n&gt;

交集类型旨在扩展现有类型并向其添加其他类型要求。

type someType = {
  keyOne: string,
  keyTwo: string
}

type someOtherType = someType & {
  keyThree: string
}

const shouldBeOk: someOtherType = {
  keyOne: 'biz',
  keyTwo: 'buzz',
  keyThree: 'baz',
}

const shouldError: someOtherType = {
  keyOne: 123,
  keyTwo: 'hello',
  keyThree: 'world',
}

// flow error:
16: const shouldError: someOtherType = {
                               ^ object literal. This type is incompatible with
8: type someOtherType = someType & {
                        ^ object type

交叉点类型的逻辑相反的是union type。根据文件:

  

联合类型要求值为输入类型之一。

     

语法:Union:&lt;类型1&gt; | &LT; <类型2> ...... | &LT;输入n&gt;

举个例子。你可以使用union类型来创建一个可枚举的。

type fooBarBazType = 'foo' | 'bar' | 'baz';
const shouldBeOk: fooBarBazType = 'bar';

const shouldError: fooBarBazType = 'buzz';

4: const shouldError: fooBarBazType = 'buzz';
                                      ^ string. This type is incompatible with
4: const shouldError: fooBarBazType = 'buzz';
                      ^ string enum

答案 1 :(得分:2)

对不起,我们接受的答案是错误的,它之所以起作用,仅仅是因为您没有使用完全匹配。

When using exact match you'll get an error

  

10:const shouldBeOk:someOtherType = {
  ^无法将对象文字分配给shouldBeOk,因为属性   keyOne在对象类型1中丢失,但在对象文字中存在   2。参考:6:键入someOtherType = someType&{|
  ^ 1 10:const shouldBeOk:someOtherType = {
  ^ 2

正确的方法是使用spread操作:

type someOtherType = {|
  ...someType,
  keyThree: string
|}

demo