TypeScript 的数组类型

96 阅读1分钟

JavaScript 数组在 TypeScript 里面分成两种类型,分别是数组(array)和元组(tuple)。

简介

TypeScript 数组有一个根本特征:所有成员的类型必须相同,

let arr:(number|string)[];
let arr:Array<number> = [1, 2, 3];

TypeScript 允许使用方括号读取数组成员的类型。

type Names = string[];
type Name = Names[0]; // string

由于数组成员的索引类型都是number,所以读取成员类型也可以写成下面这样。

type Names = string[];
type Name = Names[number]; // string

数组的类型推断

TypeScript 提供了两个专门的泛型,用来生成只读数组的类型。

const a1:ReadonlyArray<number> = [0, 1];

const a2:Readonly<number[]> = [0, 1];

类型推断的自动更新只发生初始值为空数组的情况。

只读数组,readonly

只读数组是数组的父类型,所以它不能代替数组。

let a1:number[] = [0, 1];
let a2:readonly number[] = a1; // 正确

a1 = a2; // 报错

只读数组还有一种声明方法,就是使用“const 断言”。

多维数组

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

TypeScript 的元组类型

表示成员类型可以自由设置的数组,即数组的各个成员的类型可以不同。 简介 使用扩展运算符(...),可以表示不限成员数量的元组。

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

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

元组可以通过方括号,读取成员类型。

type Tuple = [string, number];
type Age = Tuple[1]; // number

只读元组

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

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

由于只读元组不能替代元组

function distanceFromOrigin([x, y]:[number, number]) {
  return Math.sqrt(x**2 + y**2);
}

let point = [3, 4] as const;

distanceFromOrigin(point); // 报错