likes
comments
collection
share

TS中的联合类型和交叉类型

作者站长头像
站长
· 阅读数 24

前言

之前我们介绍了TS的类型,今天来补充两个:联合类型和交叉类型

大约2分钟看完,先来看交叉类型👇

交叉类型

其实一句话就能说明白:交叉类型是通过使用&符号,将多个类型合并为一个类型

这意味着我们可以把之前说的类型,多个叠加在一起作为一种类型

举例一个官方的例子🌰:

function extend<T, U>(first: T, second: U): T & U {
    let result = <T & U>{};
    for (let id in first) {
        (<any>result)[id] = (<any>first)[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            (<any>result)[id] = (<any>second)[id];
        }
    }
    return result;
}

class Person {
    constructor(public name: string) { }
}
interface Loggable {
    log(): void;
}
class ConsoleLogger implements Loggable {
    log() {
        // ...
    }
}
var jim = extend(new Person("Jim"), new ConsoleLogger());
var n = jim.name;
jim.log();

上述代码是创建混入的一个简单例子,其中返回值类型是T & U,这就是交叉类型

是不是很简单!

接下来再来看联合类型

联合类型

跟交叉类型有点相似,但又不同

相同点的是它也是用一个符号连接多个类型作为一个新类型

不同的是:

  • 交叉类型用得连接符号是&,而联合类型用的是竖线|分隔每个类型;
  • 而且表示的意思也不一样,联合类型表示一个值可以是几种类型之一,比如number | string表示一个值可以是 numberstring

如果一个值是联合类型,我们只能访问此联合类型的所有类型里共有的成员,记住是共有成员哦!

还是举例官方的例子🌰:

interface Bird {
    fly();
    layEggs();
}

interface Fish {
    swim();
    layEggs();
}

function getSmallPet(): Fish | Bird {
    // ...
}

let pet = getSmallPet();
pet.layEggs(); // okay
pet.swim();    // errors

上述代码,再次验证上面刚刚强调过的,只能访问共有成员,所以layEggs可以访问,因为它是公共的,而swimFish独有的,所以不能访问!

END

以上就是本文的所有内容,如有问题,欢迎指正~

转载自:https://juejin.cn/post/7029577757575118861
评论
请登录