交叉类型
交叉类型(Intersection Types)是将多个类型合并为一个类型。
interface DogInterface {
run(): void;
}
interface CatInterface {
jump(): void;
}
let pet: DogInterface & CatInterface = {
run() {},
jump() {}
};
交叉类型是将多个类型合并为一个类型,这就意味着这个类型拥有了所有类型的特性。
类型保护和类型守卫
类型保护(Type Guards)是一些表达式,它们会在运行时检查以确保在某个作用域里的类型。
function add(first: string | number, second: string | number) {
if(typeof first === 'string' || typeof second === 'string') {
return `${first}${second}`;
}
return first + second;
}
这段代码具体来说,就是在 add
函数中,我们使用了类型保护,它的作用是在运行时检查 first
和 second
的类型,如果是 string
类型,就执行拼接字符串的操作,否则就执行加法操作。
或者看下面这个例子:
interface IA {
a1:1,
a2:2
}
interface IB {
b1:1,
b2:2
}
function fn1(obj:IA|IB){
if(obj.a1){
console.log(obj.a1)
}else{
console.log(obj.b1)
}
}
这段代码执行时,会报错,因为 obj
的类型是 IA | IB
,而 obj.a1
和 obj.b1
都可能不存在,所以会报错。
我们可以使用类型保护来解决这个问题:
interface IA {
a1:1,
a2:2
}
interface IB {
b1:1,
b2:2
}
// 他的返回值是一个类型谓词
function getIsIA(obj:IA|IB):obj is IA{
return (obj as IA).a1;
}
function fn1(obj:IA|IB){
if(getIsIA(obj)){
console.log(obj.a1)
}else{
console.log(obj.b1)
}
}