4. TS中的数组

TS系列58629 阅读0

数组 array

根本特征:所有成员的类型必须相同,但是成员数量是不确定的,可以是无限数量的成员,也可以是零成员。

// 写法一
let arr:number[] = [1, 2, 3];

//写法二
let arr:Array<number> = [1, 2, 3]; // 这种写法本质上属于泛型

需要只读数组的时候,只需要再类型声明前加上readonly:

const arr:readonly number[] = [0, 1];

TypeScript 将readonly number[]与number[]视为两种不一样的类型,后者是前者的子类型。(因为只读数组没有pop()、push()之类会改变原数组的方法)

特殊的是:如果这样写就会报错:const arr:readonly Array = [0, 1];

需要写成这样:

// 泛型的方法生成只读数组
const a1:ReadonlyArray<number> = [0, 1];
或
const a2:Readonly<number[]> = [0, 1]

还有一种方法,利用类型断言生成只读数组:

const arr = [0, 1] as const;

多维数组:

var multi:number[][] = [[1,2,3], [23,24,25]];

元组 tuple

元组(tuple)是 TypeScript 特有的数据类型,JavaScript 没有单独区分这种类型。它表示成员类型可以自由设置的数组,即数组的各个成员的类型可以不同。

由于成员的类型可以不一样,所以元组必须明确声明每个成员的类型。

const s:[string, string, boolean] = ['a', 'b', true];

注意:元组的成员类型是写在方括号里面。

元组类型需要显式声明,否则Ts会推断类型为联合类型。

元组成员的类型可以添加问号后缀(?),表示该成员是可选的。但是只能用于元组的尾部成员,也就是说,所有可选成员必须在必选成员之后。

数组的长度不是固定的,而元组中元素的数量是固定的。但是使用扩展运算符(...),可以表示不限成员数量的元组。

type NamedNums = [
string,
...number[]
];

const a:NamedNums = ['A', 1, 2];
const b:NamedNums = ['B', 1, 2, 3];

元组也可以只读:

// 写法一
type t = readonly [number, string]

// 写法二
type t = Readonly<[number, string]>

// 写法三
const arr = [1, 2] as const;

评论

发表评论