TypeScript 类型守卫(typeof / in / instanceof / 等式收缩守卫 / 带有谓词的自定义类型守卫)通俗易懂的用法详细讲解
在TypeScript中,类型守卫(Type Guard)是一种机制,用来保证在复杂的类型环境中,变量的类型在特定的条件下得到缩小。类型守卫主要有以下几种形式:
typeof
类型守卫:检查变量的类型。
function handle(x: string | number) {
if (typeof x === "string") {
// 在这个分支中,x 的类型被缩小为 string
} else {
// 在这个分支中,x 的类型被缩小为 number
}
}
instanceof
类型守卫:检查对象的类型。
class Animal {}
class Dog extends Animal {}
function checkType(animal: Animal) {
if (animal instanceof Dog) {
// 在这个分支中,animal 的类型被缩小为 Dog
} else {
// 在这个分支中,animal 的类型被缩小为 Animal
}
}
in
类型守卫:检查对象是否具有某个属性。
interface A {
x: number;
}
interface B {
y: string;
}
function checkKey(obj: A | B) {
if ("x" in obj) {
// 在这个分支中,obj 的类型被缩小为 A
} else {
// 在这个分支中,obj 的类型被缩小为 B
}
}
- 具有谓词的自定义类型守卫:通过函数来判断类型。
function isLengthy(arg: string | number): arg is string {
return typeof arg === "string" && arg.length > 0;
}
function handle(x: string | number) {
if (isLengthy(x)) {
// 在这个分支中,x 的类型被缩小为 string
} else {
// 在这个分支中,x 的类型被缩小为 number
}
}
这些是TypeScript中常见的类型守卫方法。在实际应用中,可以根据需要选择合适的类型守卫来缩小变量的类型,从而在编译时进行类型检查。
评论已关闭