【问题标题】:Defining array with multiple types in TypeScript在 TypeScript 中定义具有多种类型的数组
【发布时间】:2015-06-05 14:29:52
【问题描述】:

我有一个表单数组:[ 1, "message" ]

如何在 TypeScript 中定义它?

【问题讨论】:

标签: arrays typescript


【解决方案1】:

在 TypeScript 中定义多种类型的数组

使用联合类型(string|number)[]演示:

const foo: (string|number)[] = [ 1, "message" ];

我有一个形式为:[ 1, "message" ] 的数组。

如果你确定总是只有两个元素[number, string],那么你可以将它声明为一个元组:

const foo: [number, string] = [ 1, "message" ];

重要提示

当您想要访问仅适用于其中一种类型的属性时,这不适用于具有不同属性的复杂类型。

See this newer answer.

【讨论】:

  • 请注意,这需要 TS v1.4+
  • ...当您想要访问仅适用于其中一种类型的属性时,它不适用于具有不同属性的复杂类型。
  • @Nadine 在这种情况下,人们能做什么?
  • 每次当你清楚它是哪种类型时,你可以做一个类型断言。然后它将可以访问属性。
  • 好点@seawave_23,如果可能的话,我建议您使用此信息编辑已接受的答案
【解决方案2】:

如果您将其视为一个元组(参见language spec 的第 3.3.3 节),那么:

var t:[number, string] = [1, "message"]

interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];

【讨论】:

  • 提示:我更喜欢type NumberStringTuple = [number, string]
  • 谢谢!我一直在寻找这个:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
  • 注意 - 两种类型都必须在数组中(也不适用于空数组)。接受的答案更通用,我个人经常使用,但这取决于需求。
【解决方案3】:

我的 TS lint 抱怨其他解决方案,所以对我有用的解决方案是:

item: Array<Type1 | Type2>

如果只有一种类型,可以使用:

item: Type1[]

【讨论】:

【解决方案4】:

我正在使用这个版本:

exampleArr: Array<{ id: number, msg: string}> = [
   { id: 1, msg: 'message'},
   { id: 2, msg: 'message2'}
 ]

它与其他建议有点相似,但仍然很容易记住。

【讨论】:

    【解决方案5】:

    我已经确定了以下格式用于键入可以包含多种类型的项目的数组。

    Array&lt;ItemType1 | ItemType2 | ItemType3&gt;

    这适用于测试和类型保护。 https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types

    这种格式不适用于测试或类型保护:

    (ItemType1 | ItemType2 | ItemType3)[]

    【讨论】:

      【解决方案6】:

      如果您有兴趣获取数字或字符串的数组,您可以定义一个类型,该类型将采用任一数组

      type Tuple = Array<number | string>
      const example: Tuple = [1, "message"]
      const example2: Tuple = ["message", 1]
      

      如果您期望一个特定顺序的数组(即数字和字符串)

      type Tuple = [number, string]
      const example: Tuple = [1, "message"]
      const example2: Tuple = ["messsage", 1] // Type 'string' is not assignable to type 'number'.
      

      【讨论】:

        【解决方案7】:

        TypeScript 3.9+ 更新(2020 年 5 月 12 日)

        现在,TypeScript 还支持命名元组。这大大提高了代码的可理解性可维护性Check the official TS playground.


        所以,现在不是未命名:

        const a: [number, string] = [ 1, "message" ];
        

        我们可以添加名字:

        const b: [id: number, message: string] = [ 1, "message" ];
        

        注意:需要一次性添加所有名称,部分名称不能省略,例如:

        type tIncorrect = [id: number, string]; // INCORRECT, 2nd element has no name, compile-time error.
        type tCorrect = [id: number, msg: string]; // CORRECT, all have a names.
        

        提示:如果不确定最后一个元素的数量,可以这样写:

        type t = [msg: string, ...indexes: number];// means first element is a message and there are unknown number of indexes.
        

        【讨论】:

        • 它有什么用?元组元素的名称?
        • @Marecky 添加它是为了便于使用,例如来自 TypeScript 编译器的提示:(property) 0: number (id) 而不是统一的(property) 0: number。因此,错误消息中也会有更多详细信息(如果有)。
        【解决方案8】:

        如果在一个对象中处理具有多种值类型的数组,这对我有用。

         { [key: string]: number | string }[]
        

        【讨论】:

          【解决方案9】:

          请注意,@basarat 接受的答案不适用于 cmets 中 @seawave23 所述的复杂类型,当您尝试访问属性时,TypeScript 会抱怨

          当您想要访问仅在其中一种类型上可用的属性时,它不适用于具有不同属性的复杂类型。

          【讨论】:

            【解决方案10】:
            const myarray:(TypeA | TypeB)[];
            

            甚至更好地避免在多个地方进行更改,以防您需要添加另一种类型,创建类型

            type MyMixedType = TypeA | TypeB;
            const myarray: MyMixedType[];
            

            【讨论】:

              猜你喜欢
              • 2022-11-25
              • 2021-01-24
              • 2020-07-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-07
              • 2022-11-07
              相关资源
              最近更新 更多