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


Answers:


308

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

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

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

我有以下形式的数组:[1,“ message”]。

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

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

2
请注意,这将需要TS v1.4 +
Brocco

5
...并且当您要访问仅对一种类型可用的属性时,它将不适用于具有不同属性的复杂类型。
纳丁

1
@Nadine在这种情况下,怎么办?
msanford

4
每当您知道类型是什么时,都可以进行类型声明。然后它将可以访问属性。
纳丁

77

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

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

要么

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

10
提示:我希望type NumberStringTuple = [number, string]
basarat

1
谢谢!我一直在寻找:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
CoderPi

1
注意-两种类型都必须在数组中(也不适用于空数组)。可接受的答案更通用,我个人经常使用,但这取决于需要。
Druvis Cukurs '17

26

我的TS皮棉抱怨其他解决方案,因此对我有用的解决方案是:

item: Array<Type1 | Type2>

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

item: Type1[]

很好,但是说,如果我们现在循环遍历数组,我们如何确定当前数组是哪种类型?
thouliha



4

我正在使用此版本:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.