「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。
一、基础类型
5. enum
使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。
(1)数字枚举
后面的元素值默认会等于前一个元素值加1,默认从0开始计算。(自增长) 当有一个元素设置数值时,后面没有设置的元素值会根据前一个元素值加1.
enum Direction { Up, Down, Left, Right }
console.log(Direction.Up); // 0
console.log(Direction.Down); // 1
console.log(Direction.Left); // 2
console.log(Direction.Right); // 3
(2)字符串枚举
字符串枚举元素值无自增长功能,需给每个元素赋值。
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
(3) 异构枚举 混合数值和字符串,很少使用:
enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES"}
6. any
若是 any 类型,则允许被赋值为任意类型。
let a: any = 1;
a = 'ss';
7. void
某种程度上来说,void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void。
function warnUser(): void { console.log("This is my warning message"); }
声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null:
let unusable: void = undefined;
8. never
never类型表示的是那些永不存在的值的类型。
值会永不存在的两种情况:
- 如果一个函数执行时抛出了异常,中断程序运行,那么这个函数永远不存在返回值;
- 函数中执行无限循环的代码(死循环),使得程序永远无法运行到函数返回值那一步,永不存在返回。
// 异常
function err(msg: string): never { // OK
throw new Error(msg);
}
// 死循环
function loopForever(): never { // OK
while (true) {};
}
注意:
never类型同null和undefined一样,也是任何类型的子类型,也可以赋值给任何类型。- 但是没有类型是
never的子类型或可以赋值给never类型(除了never本身之外),即使any也不可以赋值给never
9. 类型断言
类型断言相当于指定更确切的类型。
写法一:<类型>变量
let someValue: any = "ss";
let strLength: number = (<string>someValue).length;
写法二:变量 as 类型
let str: any = "ss";
let strLength: number = (str as string).length;
(1) 非空断言
非空断言排除 null 和 undefined。
写法:变量!
let aaa: null | undefined | string;
aaa.toString(); // 报错,aaa可能为null或undefined
aaa!.toString(); // 正确,aaa不为null和undefined
(2)确定赋值断言
确定赋值断言:确定变量一定会被赋值。
写法: 变量!: 类型
let x: number;
console.log(2 * x); // 报错,未赋值就先使用
x=2;
let x!: number;
console.log(2 * x); // 之前,x确定赋值
x=2;