什么是类型守卫?
在 TS 中遇到某些条件语句时,会在语句中的块级作用域中缩小类型的范围,我们称这种行为为类型守卫。
- typeof
- instanceof
- in
- ===、!==、!=、==
- …
类型守卫的作用
类型缩小,减少不必要的断言,区分类型集合中的不同类型。
常见的类型守卫
常用的类型守卫包括switch、字面量恒等、typeof、instanceof、in 和自定义类型守卫这几种。
如何区分联合类型?
1. switch
处理联合类型中成员或者成员属性和枚举的场景。
2. 字面量恒等
等价于 switch
建议:一般来说,如果可枚举的值和条件分支越多,那么使用 switch 就会让代码逻辑更简洁、更清晰;反之,则推荐使用字面量恒等进行判断。
3. typeof
成员不可枚举
4. instanceof
联合类型的成员可能是类。
5. in
联合类型的成员包含接口类型(对象)。
6. 自定义类型守卫
类型谓词 is
const isDog = function (animal: Dog | Cat): animal is Dog {
return 'wang' in animal;
}
const getName = (animal: Dog | Cat) => {
if (isDog(animal)) {
return animal.wang;
}
}
失效的类型守卫
类型守卫的作用就是类型缩小,如果类型不能被缩小,也就类型守卫失效了。