一:联合类型:认为一个变量可能有两种或两种以上的类型。
    用代码举个例子,声明两个接口Waiter(服务员)接口和Teacher(技师)接口,然后在写一个judgeWho(判断是谁)的方法,里边传入一个animal(任意值),这时候可以能是Waiter,也可能是Teacher。所以我们使用了联合类型,关键符号是|(竖线)。

    1. interface Waiter {
    2. anjiao: boolean;
    3. say: () => {};
    4. }
    5. interface Teacher {
    6. anjiao: boolean;
    7. skill: () => {};
    8. }
    9. function judgeWho(animal: Waiter | Teacher) {}

    二:类型保护
    1、类型断言:通过断言的方式确定传递过来的准确值,但并不会不执行,只是不报错而已。

    1. function judgeWho(animal: Waiter | Teacher) {
    2. if (animal.anjiao) {
    3. (animal as Teacher).skill();
    4. }else{
    5. (animal as Waiter).say();
    6. }
    7. }

    2、in语法

    1. function judgeWhoTwo(animal: Waiter | Teacher) {
    2. if ("skill" in animal) {
    3. animal.skill();
    4. } else {
    5. animal.say();
    6. }
    7. }

    3、typeof,判断具体数据类型之后才做处理。

    1. type sn = string | number
    2. function fn(a: sn, b: sn){
    3. if(typeof a === 'string' || typeof b === 'string'){
    4. return `${a}${b}`
    5. }
    6. return a+b
    7. }

    4、instanceof,只能用于保护对象类型。

    1. class NumberObj {
    2. count: number;
    3. }
    4. function addObj(first: object | NumberObj, second: object | NumberObj) {
    5. if (first instanceof NumberObj && second instanceof NumberObj) {
    6. return first.count + second.count;
    7. }
    8. return 0;
    9. }