type someType = {
keyOne: string,
keyTwo: string,
};
type someOtherType = {
keyOne: string,
keyTwo: string,
keyThree: string,
};
这两种类型都是包含keyOne
和keyTwo
的对象,唯一的区别是后者用keyThree
的附加键扩展前者。
而不是编写重复的代码,是否可以通过扩展someOtherType
来构建someType
流类型?在我看来,我想到了ES6对象休息/传播,但我不确定如何在Flow中完成这样的事情。
谢谢!
你要找的是intersection type。根据文件:
交集类型要求值为所有输入类型。
语法:Intersection:<type 1>&<type 2> ...&<type n>
交集类型旨在扩展现有类型并向其添加其他类型要求。
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:<type 1> | <类型2> ... | <type n>
举个例子。您可以使用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
对不起,接受的答案是错的,它的工作只是因为你没有使用完全匹配。
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
|}