我有一个表格数组:[ 1, "message" ]
。
我如何在TypeScript中定义它?
答案 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 会抱怨
<块引用>当您想访问仅在其中一种类型上可用的属性时,它不适用于具有不同属性的复杂类型。