联合类型和类型保护

联合类型 指某个参数可以是多种类型。

类型保护 指参数属于某个类型才有相应的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
interface Waiter {
anjiao: boolean
say: () => {}
}

interface Teacher {
anjiao: boolean
skill: () => {}
}

function judgeWho(animal: (Waiter | Teacher)) { // 联合类型
// 第一种断言方法
if (animal.anjiao) {
// (animal as Teacher) 的意思是:断言 animal 是 Teacher类型
(animal as Teacher).skill()
} else {
(animal as Waiter).say()
}

// 第二种断言方法
if ('skill' in animal) {
animal.skill()
} else {
animal.say()
}

// 第三种类型保护方法是使用typeof来判断 (代码省略)
}


class NumberObj {
count: number
}
function addObj(first: object | NumberObj, second: object | NumberObj) { // 联合类型
if (first instanceof NumberObj && second instanceof NumberObj) { // 类型保护
return first.count + second.count;
}
return 0;
}