什么是类型守卫?

在 TS 中遇到某些条件语句时,会在语句中的块级作用域中缩小类型的范围,我们称这种行为为类型守卫。

  • typeof
  • instanceof
  • in
  • ===、!==、!=、==

类型守卫的作用

类型缩小,减少不必要的断言,区分类型集合中的不同类型。

常见的类型守卫

常用的类型守卫包括switch、字面量恒等、typeof、instanceof、in 和自定义类型守卫这几种。

如何区分联合类型?

1. switch

处理联合类型中成员或者成员属性和枚举的场景。

2. 字面量恒等

等价于 switch

建议:一般来说,如果可枚举的值和条件分支越多,那么使用 switch 就会让代码逻辑更简洁、更清晰;反之,则推荐使用字面量恒等进行判断。

3. typeof

成员不可枚举

4. instanceof

联合类型的成员可能是类。

5. in

联合类型的成员包含接口类型(对象)。

6. 自定义类型守卫

类型谓词 is

  1. const isDog = function (animal: Dog | Cat): animal is Dog {
  2. return 'wang' in animal;
  3. }
  4. const getName = (animal: Dog | Cat) => {
  5. if (isDog(animal)) {
  6. return animal.wang;
  7. }
  8. }

失效的类型守卫

类型守卫的作用就是类型缩小,如果类型不能被缩小,也就类型守卫失效了。