【发布时间】:2020-06-12 21:56:02
【问题描述】:
type WeirdCustomType = {[int]: boolean, ...};
WeirdCustomType是一个什么样的结构?它只是{int:boolean} 类型的数组吗? (即,key 是 int,value 是 boolean)?如果是这样,这里的 ... 是什么意思?我在哪里可以了解这种特殊类型的别名用法?
【问题讨论】:
标签: javascript flow
type WeirdCustomType = {[int]: boolean, ...};
WeirdCustomType是一个什么样的结构?它只是{int:boolean} 类型的数组吗? (即,key 是 int,value 是 boolean)?如果是这样,这里的 ... 是什么意思?我在哪里可以了解这种特殊类型的别名用法?
【问题讨论】:
标签: javascript flow
WeirdCustomType 是“Explicit inexact object type”
它的属性包括:
int 周围的括号表示我们指的是属性键,并且这些键的类型为 int(实际上应该是 number,请参阅我回答的最后一部分)WeirdCustomType 的对象如下所示:
const inexactObject: WeirdObjectType = {
1: ‘foo’,
2: ‘bar’,
baz: ‘abc’
}
WeirdCustomType 上的省略号明确表示(为了更清楚)这种类型允许具有额外属性的对象,而这些属性应该是普通对象类型。
要禁用该行为,您可以使用exact object type。如文档中所述,
与常规对象类型不同,将具有“额外”属性的对象传递给确切的对象类型是无效的。
// @flow
var foo: {| foo: string |} = { foo: "Hello", bar: "World!" }; // Error!
这是解释动机的post on Medium。
目前,
{foo: number}是任何具有foo属性和类型number的对象的类型。{| foo: number |}是一个对象的类型,它只有一个属性foo,类型为number。我们说前者语法是不精确对象,后者是精确对象。在一些版本中,Flow 将开始将
{foo: number}视为一个精确对象。要表示不准确,您必须在对象类型的末尾添加一个省略号:{foo: number, ...}。这种新语法迫使开发人员选择不精确。
int 类型Flow 实际上没有原始类型 int。整数由number 类型表示。我认为[int] 应该是[number]。
【讨论】:
{ [number]: boolean }的意思是“对象中的所有属性,其键的类型为number,值应该是boolean.