Skip to main content

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)
}
}