流:通过扩展另一种类型来创建流类型
Posted
技术标签:
【中文标题】流:通过扩展另一种类型来创建流类型【英文标题】:Flow: Create a flow type by extending another type 【发布时间】:2017-07-23 19:11:36 【问题描述】:type someType =
keyOne: string,
keyTwo: string,
;
type someOtherType =
keyOne: string,
keyTwo: string,
keyThree: string,
;
这两种类型都是包含keyOne
和keyTwo
的对象,唯一的区别是后者扩展前者带有一个额外的键keyThree
。
与其编写重复的代码,是否可以通过扩展someType
来构建someOtherType
流类型?在我的脑海中,ES6 object rest/spread 浮现在脑海中,但我不确定如何在 Flow 中完成这样的事情。
谢谢!
【问题讨论】:
FlowType: Inheritance of Types (Type A is a subset of type B ...)的可能重复 酷,感谢您的链接。 【参考方案1】:您正在寻找的是intersection type。根据文档:
交集类型要求值是所有输入类型。
语法:交集: & ... &
交集类型旨在扩展现有类型并向其添加额外的类型要求。
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。根据文档:
联合类型要求值是输入类型之一。
语法:联合: | ... |
举个例子。您可以使用联合类型来创建可枚举。
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
【讨论】:
上述“可能重复”的答案已过时。交叉口类型have been implemented since July 1, 2016. 它没有过时。在我对该链接的回答中,我提到了交集类型。它们确实适用于大多数情况。但是,它们可能会导致奇怪的错误消息,并且在某些情况下(例如,使用确切类型)不能按预期工作。对象类型传播会更好地用于此目的,事实上它昨天刚刚登陆:github.com/facebook/flow/commit/… 抱歉,纳特,我误会了。我以为你是说交叉口类型尚未发布。 我在文档中到处都在寻找这个,但我忽略了交集,因为类型扩展与集合交集的概念无关。这是一个集合加入操作。非常混乱。【参考方案2】:抱歉,接受的答案是错误的,它只是因为您没有使用完全匹配而起作用。
When using exact match you'll get an error:
10: const shouldBeOk: someOtherType = ^ 无法将对象文字分配给
shouldBeOk
,因为属性keyOne
在对象类型 1 中缺失,但存在于对象字面量中 2。参考资料: 6: type someOtherType = someType & | ^ 1 10: const shouldBeOk: someOtherType = ^2
正确的做法是使用spread
操作:
type someOtherType = |
...someType,
keyThree: string
|
demo
【讨论】:
除了传播之外,还有一些Utility Types可以帮助混合/匹配类型本体。 +1 提及传播。以上是关于流:通过扩展另一种类型来创建流类型的主要内容,如果未能解决你的问题,请参考以下文章