TypeScript(九)类型守卫

464 阅读1分钟

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 {
   namestring;
   speakstring;
}
​
interface two {
   agenumber;
   seestring;
}
​
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 padderPadder = getrandom();
​
// 判断padder是否是Space的实例对象,如果中间有其他值覆盖了,会出现问题
if(padder instanceof Space) {
   // 判断后,确保这个值是它的实例对象 padder 类型收缩在'SpaceRepatingPadder'
}
function isString (ownany): own is string {
   return typeof own === 'string';
}
function test(xdom: any) {
   if(isString(xdom)) {
       // xdom 限制为 'string'
  } else {
       // 其他类型
  }
}