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

时间:2015-04-01 03:32:13

标签: typescript

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

我如何在TypeScript中定义它?

10 个答案:

答案 0 :(得分:153)

  

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

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

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

我有一个表格数组:[1,“message”]。

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

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

答案 1 :(得分:62)

如果您将其视为元组(请参阅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"];

答案 2 :(得分:13)

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

item: Array<Type1 | Type2>

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

item: Type1[]

答案 3 :(得分:3)

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.

答案 4 :(得分:1)

我正在使用此版本:

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

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

答案 5 :(得分:0)

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

Array<ItemType1 | ItemType2 | ItemType3>

这与测试和类型防护程序一起很好地工作。 https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types

此格式不适用于测试或类型防护:

(ItemType1 | ItemType2 | ItemType3)[]

答案 6 :(得分:0)

如果您对获取数字或字符串数​​组感兴趣,则可以定义将采用其中一个数组的类型

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 :(得分:0)

您可以使用常规元组

param(
    $fileName = "d:\tmp\file.txt",
    $name = "Alan"
)
@'
Mohammed 3 4 5 4

Alan 2 1 3 2

Li 3 5 1 3
'@ | Out-File $fileName -Encoding default

$hash = Get-Content $fileName | Where-Object {$_} | ForEach-Object {
    $array = $_ -split "\s+"
    @{
        $array[0] = [Linq.Enumerable]::Average([int[]]($array[1..($array.Count-1)]))  
    }
} 

if ($hash.Keys -contains $name){
    return "$name->$($hash.$name)"
}
else {
    return "$name=>no $name"
}

或者如果需要可选参数支持

interface IReqularDemo: [number, string];

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

<块引用>

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