【发布时间】:2015-06-05 14:29:52
【问题描述】:
我有一个表单数组:[ 1, "message" ]。
如何在 TypeScript 中定义它?
【问题讨论】:
-
与这个类似的问题,没有答案,但这次使用了未知数量的项目的类继承,并且都扩展了同一个类:stackoverflow.com/questions/50322488/…
标签: arrays typescript
我有一个表单数组:[ 1, "message" ]。
如何在 TypeScript 中定义它?
【问题讨论】:
标签: arrays typescript
在 TypeScript 中定义多种类型的数组
使用联合类型(string|number)[]演示:
const foo: (string|number)[] = [ 1, "message" ];
我有一个形式为:[ 1, "message" ] 的数组。
如果你确定总是只有两个元素[number, string],那么你可以将它声明为一个元组:
const foo: [number, string] = [ 1, "message" ];
重要提示
当您想要访问仅适用于其中一种类型的属性时,这不适用于具有不同属性的复杂类型。
【讨论】:
如果您将其视为一个元组(参见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], ... ];
我的 TS lint 抱怨其他解决方案,所以对我有用的解决方案是:
item: Array<Type1 | Type2>
如果只有一种类型,可以使用:
item: Type1[]
【讨论】:
我正在使用这个版本:
exampleArr: Array<{ id: number, msg: string}> = [
{ id: 1, msg: 'message'},
{ id: 2, msg: 'message2'}
]
它与其他建议有点相似,但仍然很容易记住。
【讨论】:
我已经确定了以下格式用于键入可以包含多种类型的项目的数组。
Array<ItemType1 | ItemType2 | ItemType3>
这适用于测试和类型保护。 https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types
这种格式不适用于测试或类型保护:
(ItemType1 | ItemType2 | ItemType3)[]
【讨论】:
如果您有兴趣获取数字或字符串的数组,您可以定义一个类型,该类型将采用任一数组
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'.
【讨论】:
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.
【讨论】:
(property) 0: number (id) 而不是统一的(property) 0: number。因此,错误消息中也会有更多详细信息(如果有)。
如果在一个对象中处理具有多种值类型的数组,这对我有用。
{ [key: string]: number | string }[]
【讨论】:
请注意,@basarat 接受的答案不适用于 cmets 中 @seawave23 所述的复杂类型,当您尝试访问属性时,TypeScript 会抱怨
当您想要访问仅在其中一种类型上可用的属性时,它不适用于具有不同属性的复杂类型。
【讨论】:
const myarray:(TypeA | TypeB)[];
甚至更好地避免在多个地方进行更改,以防您需要添加另一种类型,创建类型
type MyMixedType = TypeA | TypeB;
const myarray: MyMixedType[];
【讨论】: