类型保护
类型保护就是一些表达式,他们在编译的时候就能通过类型信息确保某个作用域内变量的类型 其主要思想是尝试检测属性、方法或原型,以确定如何处理值
typeof 类型保护
function double(input: string | number | boolean) {
if (typeof input === "string") {
return input + input;
} else {
if (typeof input === "number") {
return input * 2;
} else {
return !input;
}
}
}
in 关键字
interface Bird {
fly: number;
}
interface Dog {
leg: number;
}
function getNumber(value: Bird | Dog) {
if ("fly" in value) {
return value.fly;
}
return value.leg;
}
instanceof 类型保护
class Animal {
name!: string;
}
class Bird extends Animal {
fly!: number;
}
function getName(animal: Animal) {
if (animal instanceof Bird) {
console.log(animal.fly);
} else {
console.log(animal.name);
}
}
自定义类型保护
通过 type is xxx 这样的类型谓词来进行类型保护 例如下面的例子 value is object 就会认为如果函数返回 true 那么定义的 value 就是 object 类型
function isObject(value: unknown): value is object {
return typeof value === "object" && value !== null;
}
function fn(x: string | object) {
if (isObject(x)) {
// ....
} else {
// .....
}
}