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

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,
;

这两种类型都是包含keyOnekeyTwo 的对象,唯一的区别是后者扩展前者带有一个额外的键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 提及传播。

以上是关于流:通过扩展另一种类型来创建流类型的主要内容,如果未能解决你的问题,请参考以下文章

如何通过分析字节模式来确定音频流类型

如何将嵌入元素类型从 PDF 流切换到文本流

通过判断流的头 判断文件类型

C#根据文件流判断文件类型

通过流数据更新防止选择输入重置

Java中有几种类型的流