interface Bird {
fly: boolean
sing: () => {}
}
interface Dog {
fly: boolean
bark: () => {}
}
// 类型断言的方式
const tarinAnimal = (animal: Bird | Dog) => {
if (animal.fly) {
;(animal as Bird).sing()
} else {
;(animal as Dog).bark()
}
}
// 用in语法来做类型保护
const trainAnimalSecond = (animal: Bird | Dog) => {
if ('sing' in animal) {
animal.sing()
} else {
animal.bark()
}
}
// typeof做类型保护
const add = (first: string | number, second: string | number) => {
if (typeof first === 'string' || typeof second === 'string') {
return `${first}${second}`
} else {
return first + second
}
}
// instanceof语法做类型保护
class NumberObj {
count: number
}
const addAgain = (first: object | NumberObj, second: object | NumberObj) => {
if (first instanceof NumberObj && second instanceof NumberObj) {
return first.count + second.count
}
return 0
}