什么是类型守卫
A type guard is some expression that performs a runtime check that guarantees the type in some scope.
Typescript在运行时只有Javascript,这时候如何确定变量的类型?
内置类型守卫
Typescript有内置的三个类型守卫:typeof
、instanceof
、Array.isArray
typeof
原始类型可以通过typeof
来检查
1 | typeof '23' // [LOG]: "string" |
instanceof
Javascript中也有instanceof
运算符,来检查一个实例是否是某个原型。Typescript中可以用来检查是否是某个Class的实例
1 | function isSomeClass<T>(instance: any, Class: new (...args: any[]) => T) { |
Array.isArray
Array中的一个方法,检查是否为数组
自定义类型守卫
除了以上三种内置类型守卫外,对于复合类型,我们需要自定义类型守卫。
如何自定义类型守卫?
类型谓词
什么是类型谓词?
type predicate类型谓词,一个返回
xx is T
的函数。谓词就是parameterName is Type
.parameterName
必须是函数签名中的参数名。1
2
3function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}TS中可以使用
this is Type
来检查class type
in
操作符JS中可以通过
in
操作符来检查对象中是否包含某个属性。TS使用in
操作符来判断当前类型是联合类型中的哪一个。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15type Human = {
walk: () => void;
}
type Superman = {
fly: () => void;
}
function move(creature: Human | Superman) {
if ('fly' in creature) {
return creature.fly();
}
return creature.walk();
}