聯(lián)合類型,就是用 | 用算符,結(jié)合兩個(gè)類型
- 聯(lián)合類型變量去取值的時(shí)候,只能取到這幾個(gè)類型共有的屬性和方法。
interface Bird {
fly: boolean;
sing: () => {};
}
interface Dog {
fly: boolean;
bark: () => {};
}
// anima 這個(gè)變量是可以聯(lián)合類型,即可以是一個(gè)Bird又可以是一個(gè)Dog
// 聯(lián)合類型通過 | 來實(shí)現(xiàn)
// 但是聯(lián)合類型變量去取值的時(shí)候,只能取到這幾個(gè)類型共有的屬性和方法
function trainAnimal(anima: Bird | Dog) {
anima.fly
}
如果調(diào)用不共有的屬性和方法,就會(huì)報(bào)錯(cuò),因?yàn)椴淮_定參數(shù)的類型,到底是哪個(gè),所以調(diào)用獨(dú)有的方法會(huì)報(bào)錯(cuò)。如果想要代碼更嚴(yán)謹(jǐn),這個(gè)時(shí)候就需要類型保護(hù)的機(jī)制。
類型保護(hù)的幾種實(shí)現(xiàn)方法
- 方式1
類型斷言的方式, 我們通過類型斷言的方式,和自身對邏輯的理解去確保代碼能夠不再提錯(cuò)
function trainAnimal(animal: Bird | Dog) {
// 如果我們知道animal.fly是true,那么它一定是一個(gè)bird類型。那么我們就通過as斷言的方式,告訴你它就是Bird類型。
if (animal.fly) {
(animal as Bird).sing()
}else {
(anima as Dog).bark()
}
}
function trainAnimalSecond(animal: Bird | Dog) {
// 我判斷,如果animal里有sing方法,再去調(diào)用sing方法
// typescript也會(huì)理解這個(gè)語法的意思,就不再報(bào)錯(cuò)
if ('sing' in anima) {
animal.sing();
} else {
animal.bark()
}
}
function add(first: string | number, second: string | number) {
if (typeof first === 'string' || typeof second === 'string') {
return `${first}${second}`;
}
return first + second;
}
- 方式4
使用instanceof 語法做類型保護(hù),使用instanceof 做類型保護(hù)的前提是 數(shù)據(jù)結(jié)構(gòu)的定義要使用 class而不是interface,因?yàn)橹挥蓄惪梢员籭nstanceof 操作符調(diào)用,而instanceof 不可以
class NumberObj {
count:number
}
function addSecond(first: object | NumberObj, second: object | NumberObj) {
if (first instanceof NumberObj && second instanceof NumberObj) {
return first.count + second.count;
}
return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。