typeScript的枚举类型和数组类型的使用和实例(推荐阅读)

一句话总结
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'];
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值