1. 什么是类型守卫
当遇到条件语句时,会限制变量类型
- 类型判断:
typeof - 实例判断:
instanceof - 属性判断:
in - 字面量相等判断:
==,===,!=,!==
2. 类型判断(typeof)
function test(own: string | boolean | number) {
if(typeof own == 'string') {
// 这里own的类型限制为string
} else if(typeof own == 'number') {
// 这里 own 的类型限制为 number
} else {
// 这里的类型限制为 boolean
}
}
3. 属性判断(in)
interface one {
name: string;
speak: string;
}
interface two {
age: number;
see: string;
}
function test(own: one | two) {
if("name" in own) {
// 这里限制为own 对象为 one
console.log(own.speak);
}
if("see" in own) {
// 这里限制为own 对象为 two
console.log(own.see);
}
}
4. 实例判断(instanceof)
interface Padder {
getPaddingString(): string
}
class Space implements Padder {
constructor(private numSpace: number) {}
getPaddingString() {
return Array(this.numSpaces + 1).join(" ");
}
}
class StringPadder implements Padder {
constructor(private value: string) {}
getPaddingString() {
return this.value;
}
}
function getrandom() {
return Math.random() < 0.5 ? new Space(4) : new StringPadder("");
}
let padder: Padder = getrandom();
// 判断padder是否是Space的实例对象,如果中间有其他值覆盖了,会出现问题
if(padder instanceof Space) {
// 判断后,确保这个值是它的实例对象 padder 类型收缩在'SpaceRepatingPadder'
}
function isString (own: any): own is string {
return typeof own === 'string';
}
function test(xdom: any) {
if(isString(xdom)) {
// xdom 限制为 'string'
} else {
// 其他类型
}
}