# 原始数据类型 & 联合类型

# 数值

let notANumber: number = NaN;
let infinityNumber: number = Infinity;
1
2

NaNInfinity都是属于number类型.

# 空值

void可以表示没有返回值的函数:

function alertName(): void {
  alert("My name is Tom");
}
1
2
3

void也可以用来定义nullundefined的类型:

let u: void = undefined;
1

# Null & Undefined

在 TypeScript 中, 可以使用 null 和 undefined 来定义这两个原始数据类型:

let u: undefined = undefined;
let n: null = null;
1
2

与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

// 这样不会报错
let num: number = undefined;

// 这样也不会报错
let u: undefined;
let num: number = u;
1
2
3
4
5
6

可是void类型的变量不能赋值给其他类型:

let u: void;
let num: number = u;

// Type 'void' is not assignable to type 'number'.
1
2
3
4

# never & unknown

never是一个函数的返回类型, 适用于 js 无法正常执行下去的情况:

// 情况一:
function throwError(errorMsg: string): never {
  throw new Error(errorMsg); //抛出错误, 无法继续执行后面的代码
}

// 情况二:
function keepProcessing(): never {
  while (true) {
    console.log("I always does something and never ends.");
  }
}
1
2
3
4
5
6
7
8
9
10
11

unknown表示当前无法确定该变量的类型.

let a: unknown;

a = 1;
a = "xxx";
1
2
3
4

上面的代码能够通过编译, 不会报错. 那么, 把a定义为any类型, 上面的代码也是能够通过编译的, 那么它和any的区别是什么?

let a: unknown;
let s: string;

a = "string";
s = a; // !Type 'unknown' is not assignable to type 'string'.ts(2322)
1
2
3
4
5

由上面的报错看见, unknown是一个明明确确的一个类型,它和any区别在于, 使用any的变量等于禁用了类型检查.

# 联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种.

let myFavoriteNumber: string | number;
myFavoriteNumber = "seven";
myFavoriteNumber = 7;
1
2
3

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候, 我们只能访问此联合类型的所有类型里共有的属性或方法. 比如当联合类型是stringnumber时, 访问.length是会报错的.