typescript入门(二)

137 阅读2分钟

「这是我参与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类型的变量没有什么大用,因为你只能为它赋予undefinednull

let unusable: void = undefined;

8. never

never类型表示的是那些永不存在的值的类型。

值会永不存在的两种情况:

  1. 如果一个函数执行时抛出了异常,中断程序运行,那么这个函数永远不存在返回值;
  2. 函数中执行无限循环的代码(死循环),使得程序永远无法运行到函数返回值那一步,永不存在返回。
// 异常
function err(msg: string): never { // OK
  throw new Error(msg); 
}

// 死循环
function loopForever(): never { // OK
  while (true) {};
}

注意

  • never类型同nullundefined一样,也是任何类型的子类型,也可以赋值给任何类型。
  • 但是没有类型是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;