【问题标题】:Type alias in flow with brackets and ellipsis用括号和省略号在流中键入别名
【发布时间】:2020-06-12 21:56:02
【问题描述】:
type WeirdCustomType = {[int]: boolean, ...};

WeirdCustomType是一个什么样的结构?它只是{int:boolean} 类型的数组吗? (即,key 是 int,value 是 boolean)?如果是这样,这里的 ... 是什么意思?我在哪里可以了解这种特殊类型的别名用法?

【问题讨论】:

    标签: javascript flow


    【解决方案1】:

    WeirdCustomType 是“Explicit inexact object type

    它的属性包括:

    • A) 具有布尔值的整数键的属性
      • int 周围的括号表示我们指的是属性键,并且这些键的类型为 int(实际上应该是 number,请参阅我回答的最后一部分)
      • 这遵循对象及其键的解构语法,您可以在 MDN 文档中阅读有关“Computed object property names and destructuring”的更多信息
    • B) 具有其他键和值类型的附加属性

    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]

    https://flow.org/en/docs/types/primitives/

    【讨论】:

    • 谢谢。我仍然对 int 周围的 [] 感到困惑。为什么这意味着它指的是属性键? [] 不是表示它是一个数组或元组吗?
    • 你读过解构的文档吗?如果它不在括号中,则键将被解析为字面上的“键‘数字’应该有一个布尔值”。将其放在括号中会将含义更改为“对于‘数字’类型的键,值应该是布尔值。”
    • 指的是一个键数组,因为{ [number]: boolean }的意思是“对象中的所有属性,其键的类型为number,值应该是boolean.
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多