在TypeScript中使用多种类型定义数组

dk1*_*123 126 typescript

我有一个表格的数组:[ 1, "message" ].

我如何在TypeScript中定义它?

bas*_*rat 213

在TypeScript中使用多种类型定义数组

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

const foo: (string|number)[] = [ 1, "message" ];
Run Code Online (Sandbox Code Playgroud)

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

如果您确定始终只有两个元素,[number, string]那么您可以将其声明为元组:

const foo: [number, string] = [ 1, "message" ];
Run Code Online (Sandbox Code Playgroud)

  • ...当您想要访问仅在其中一种类型上可用的属性时,它将不适用于具有不同属性的复杂类型. (4认同)
  • 每当您清楚它是哪种类型时,您都可以进行类型断言.然后它将用于访问属性. (4认同)
  • 请注意,这将需要TS v1.4 + (2认同)
  • @Nadine 在这种情况下,人们能做什么? (2认同)

cur*_*rpa 70

如果您将其视为元组(请参阅语言规范的 3.3.3节),那么:

var t:[number, string] = [1, "message"]
Run Code Online (Sandbox Code Playgroud)

要么

interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];
Run Code Online (Sandbox Code Playgroud)

  • 提示:我更喜欢`type NumberStringTuple = [number,string]` (10认同)

小智 20

我的TS lint抱怨其他解决方案,所以适合我的解决方案是:

item: Array<Type1 | Type2>
Run Code Online (Sandbox Code Playgroud)

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

item: Type1[]
Run Code Online (Sandbox Code Playgroud)

  • @thouliha /sf/ask/3554235331/​​-typescript (2认同)

Ole*_*nyi 10

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

现在,TypeScript 也支持命名元组。这大大增加了代码的可理解性可维护性查看官方 TS 游乐场。


所以,现在而不是未命名:

const a: [number, string] = [ 1, "message" ];
Run Code Online (Sandbox Code Playgroud)

我们可以添加名称:

const b: [id: number, message: string] = [ 1, "message" ];
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

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

type t = [msg: string, ...indexes: number];// means first element is a message and there are unknown number of indexes.
Run Code Online (Sandbox Code Playgroud)

  • @Marecky 添加它是为了便于使用,例如 TypeScript 编译器的提示:“(property) 0: number (id)”而不是统一的“(property) 0: number”。因此,错误消息中也会包含更多详细信息(如果有)。 (2认同)

小智 6

我已经决定使用以下格式来键入可以具有多种类型项的数组。

Array<ItemType1 | ItemType2 | ItemType3>

这对于测试和类型防护很有效。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]
Run Code Online (Sandbox Code Playgroud)

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

type Tuple = [number, string]
const example: Tuple = [1, "message"]
const example2: Tuple = ["messsage", 1] // Type 'string' is not assignable to type 'number'.
Run Code Online (Sandbox Code Playgroud)


Der*_*rim 5

我正在使用这个版本:

exampleArr: Array<{ id: number, msg: string}> = [
   { id: 1, msg: 'message'},
   { id: 2, msg: 'message2'}
 ]
Run Code Online (Sandbox Code Playgroud)

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


Tec*_*ard 5

const myarray:(TypeA | TypeB)[];
Run Code Online (Sandbox Code Playgroud)

或者更好地避免在多个位置进行更改,以防您需要添加其他类型、创建类型

type MyMixedType = TypeA | TypeB;
const myarray: MyMixedType[];
Run Code Online (Sandbox Code Playgroud)