一句话总结
Tuple 元组类型 元组是一种**固定长度的数组,每个元素有自己的类型**
enum 枚举类型 使用枚举类型可以为一组数值赋予友好的名字
枚举类型
通过以下语法可以**定义**新的枚举类型:
enum T { ... }
其中 `T` 是任意定义的名字,省略号 `...` 表示可以定义一个或多个可以显式初始化的**枚举值**。如:
enum Direction {
Up, // 值默认为 0
Down, // 值默认为 1
Left, // 值默认为 2
Right // 值默认为 3
}
上述语句定义了新的枚举类型关键字 `Direction`,现在可以用这个关键字声明新的枚举类型:
// 声明d为枚举类型Direction
let d: Direction;
定义枚举类型的时候就限制了枚举的取值范围,上述定义中枚举类型有4个值 `Direction.UP`、`Direction.Down`、`Direction.Left`、`Direction.Right`,枚举类型在任一时刻只能取这4个值其中之一
// 声明并初始化
let d: Direction = Direction.Down;
// 改变枚举类型的值
d = Direction.Up;
枚举值的默认值和自增性
如果没有对枚举值**显式初始化**,那么**枚举值默认为数字类型**,第一个出场的元素默认为数字 `0`,后续未显式初始化的枚举值会在前一个**数字值**的基础上自动 `+1`。根据规则,可以得出前面的枚举定义中:
Direction.Up === 0;
Direction.Down === 1;
Direction.Left === 2;
Direction.Right === 3;
如果我们为枚举定义显式添加**数字默认值**:
enum Direction {
Up = 2,
Down,
Left = 3.3
Right
}
则得出:
Direction.Up === 2; // 显式初始化
Direction.Down === 3; // 2 + 1 = 4.3
Direction.Left === 3.3; // 显式初始化
Direction.Right === 4.3; // 3.3 + 1 = 4.3
在上述场景中,枚举值实际上就是数字类型 `number`,此时可以将枚举值直接赋值给数字:
let n: number = Direction.Right; // 合法
作为字符串的枚举值
除了初始化为数字,还可以将枚举值显式初始化为字符串:
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT'
}
// 正确
Direction.Up === 'UP';
Direction.Down === 'DOWN';
Direction.Left === 'LEFT';
Direction.Right === 'RIGHT';
// 枚举值是字符串,直接赋值给字符串类型
let s: string = Direction.Up;
在初始化为字符串的场景中,值的数字自增性依然起作用。如果一个没有显式初始化的枚举值前面是一个字符串,将会报错:
enum Direction {
Up = 'UP',
Down, // error TS1061: Enum member must have initializer
Left, // error TS1061: Enum member must have initializer
Right // error TS1061: Enum member must have initializer
}
虽然枚举值 `Direction.Down` 没有显式初始化,但自增引擎仍然会起作用:编译器检测到前面一个出场的值 `Direction.Up` 为字符串类型,无法自增 `+1`,此时编译器报错。改正这个错误很简单:
enum Direction {
Up = 'UP',
Down = 3,
Left, // 不会报错,值为 3+1=4
Right // 不会报错,值为 4+1=5
}
// 正确
Direction.Up === 'UP';
Direction.Down === 3;
Direction.Left === 4;
Direction.Right === 5;
数组类型
数组类型的语法为:T[];
其中 `T` 可以是任何类型,代表的是数组的元素类型
let list: number[] = [1, 2, 3];
// 二维数组
let vec: number[][] = [[1, 2, 3], [1, 2, 3]];
元组类型
元组和数组类似,只不过元组是一种**固定长度的数组,每个元素有自己的类型**。元组(Tuple)的语法为:[T0, T1, ...]
`T0, T1`代表任意类型,省略号表示可以有任意多个元素。
// 声明一个元组,包含两个元素,第一个元素为string类型,第二个元素为number类型
let x: [string, number];
// 正确
x = ['hello', 10];
// 错误;元素类型不匹配
// error TS2322: Type 'number' is not assignable to type 'string'
// error TS2322: Type 'string' is not assignable to type 'number'
x = [10, 'hello'];
// 错误;长度不匹配
// error TS2741: Property '1' is missing in type '[string]' but required in type '[string, number]'
x = ['hello'];