类型守卫
在前几篇介绍了断言,在使用断言时我们已经确定了变量的类型,确定该类型时一定存在(否则则会欺骗编译,运行时报错),那么为什么还要类型守卫呢?因为类型断言还是需要借助类型守卫的,类型守卫主要是用来判断未知类型是不是所需要的类型。 类型守卫主要包括四种方式:
- in
- typeof
- instanceof
- 自定义类型
1、in- 定义属性场景下内容的确认
先写两个接口Teacher、Student,然后将这两个接口进行联合声明,使用in
来判断属性是否在传递的参数中,然后分别作输出。 缺点:用 in 关键字缩小数据类型必须有一个独特的属性作为判别标准,否则不能用 in 关键字
interface Teacher{ name:string; courses:string;
}
interface Student{ name:string; study:string;
}
type Class = Teacher | Student;
function getInfo(val:Class){ //此时val类型缩小为Teacher类型 if('courses' in val){console.log(val.courses) } //此时val类型缩小为Student类型 if('study' in val){console.log(val.study) }
}
getInfo({ name: 'student', study: "Philosophy" });
//打印结果为Philosophy,因为传参中含有