Notes
TypeScript
TypeScript 高级特性

交叉类型

交叉类型(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 函数中,我们使用了类型保护,它的作用是在运行时检查 firstsecond 的类型,如果是 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.a1obj.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)
    }
}