any 和 unknown

any 和 unknown 都是 ts 中的顶级类型(top type),任何类型的值都可以赋值给顶级类型,但顶级类型是否可以赋值给任意值?
unknown 是 typescript 3.0 才引入的类型,为的就是解决 any 没有检查的问题,让顶级类型也有校验和检查。
二者的区别用语言不好描述,这里以一个例子为例解释二者的区别:

任何类型的值都可以赋值给 any 和 unknown

  1. let a: any = "a string"
  2. let a: any = 123;
  3. let a: any = true;
  4. ...
  1. let a: unknown = "a string"
  2. let a: unknown = 123;
  3. let a: unknown = true;
  4. ...

unknown 的值不能随意赋与给任何值

  1. let a: any = "hello";
  2. let b: string = a; // 不报错
  1. let a: unknown = "hello";
  2. let b: string = a; // 报错 Type 'unknown' is not assignable to type 'string'

如何正确使用 unknown 值?

unknown 类型的值在使用时需要先进行类型收窄处理。有以下两种方式。

  1. 使用 typeof 或 instanceof 进行判断后使用 ```typescript let a: unknown = “hello”; let b: string;

if(typeof a === “string”) { b = a; }

  1. 2. 使用强制类型转换(必须要在确实知道此时的值的类型,否则容易出问题)
  2. ```typescript
  3. let a: unknown = "hello";
  4. let b: string = a as string;

因此,在 any 和 unknown 都可以的情况下要优先用 unknown, ts 在设计出 unknown 的目的也是为了替代 any 类型的。

never 类型

never 是底类型,never 可以赋值给任何类型。但所有的值都不能赋值给 never 类型。
never 类型表示永远不可到达的类型。

  1. interface A {
  2. type: "A"
  3. }
  4. interface B {
  5. type: "B"
  6. }
  7. type All = A | B
  8. function handleValue(val: All) {
  9. switch(val.type) {
  10. case "A":
  11. break;
  12. case "B":
  13. break;
  14. default:
  15. let b: never = val; // 这里就是 never
  16. break;
  17. }
  18. }