TypeScript類(lèi)型推論與類(lèi)型斷言實(shí)例詳解
一、類(lèi)型推論
類(lèi)型推論,顧名思義就是指類(lèi)型在哪里如何被推斷。在TS語(yǔ)法中,如果有些沒(méi)地方有明確指出類(lèi)型,類(lèi)型推論就會(huì)幫助提供類(lèi)型,即聲明變量時(shí),不賦給類(lèi)型,就會(huì)觸發(fā)類(lèi)型推論。
1、最佳通用類(lèi)型
最佳通用類(lèi)型就是指,在一個(gè)或者多個(gè)表達(dá)式中,變量的類(lèi)型會(huì)從這些表達(dá)式中的所有類(lèi)型來(lái)推斷出一個(gè)最合適的通用類(lèi)型。
舉個(gè)例子:
let brand = 'YSL' brand = 123
當(dāng)定義一個(gè)變量brand
,變量brand的類(lèi)型被推斷為字符串,但是后來(lái)修改值為另外一種類(lèi)型,如number,boolean等,TS就會(huì)很貼心的提示不能將其他類(lèi)型分配給字符串。然而這只是從單個(gè)表達(dá)式里面推斷,如果是多個(gè)表達(dá)式呢?又會(huì)如何推斷呢?例如:
let money = [1, 'yuan', null] money = [123] money = ['hello'] money = [null]? ? money = [{ name: 'ducky' }]//錯(cuò)誤提示
可見(jiàn),當(dāng)需要從幾個(gè)表達(dá)式中推斷類(lèi)型時(shí)候,會(huì)使用這些表達(dá)式的類(lèi)型來(lái)推斷出一個(gè)最合適的通用類(lèi)型---稱(chēng)為最佳通用類(lèi)型。當(dāng)有多個(gè)表達(dá)式時(shí),為了推斷money
的類(lèi)型,必須要考慮所有元素的類(lèi)型。 這里有三種選擇: number
,string
和null
。 計(jì)算通用類(lèi)型算法會(huì)考慮所有的候選類(lèi)型,并給出一個(gè)兼容所有候選類(lèi)型的類(lèi)型。那如果想要的類(lèi)型不在候選名單上,又該如何推論呢?例如:
function Animal() { console.log('animal'); } function Food() { console.log('food'); } function Fruit() { console.log('fruit'); } let target= [new Animal(), new Food(), new Fruit()]
如果想讓terget
的類(lèi)型被推斷為People[]
類(lèi)型,但是數(shù)組里的候選類(lèi)型有三種,沒(méi)有People[]
類(lèi)型,這肯定是不能推斷出結(jié)果的。那怎么辦呢?這種情況下,當(dāng)候選類(lèi)型不能使用的時(shí)候,我們必須明確地指出類(lèi)型:
let target:People[]= [new Animal(), new Food(), new Fruit()]
此時(shí),如果沒(méi)有找到最佳通用類(lèi)型的話,target
會(huì)被推斷為聯(lián)合數(shù)組類(lèi)型:(Animal|Food|Fruit)[]
2、上下文類(lèi)型
上下文類(lèi)型取決于表達(dá)式的類(lèi)型和其所處的位置,例如:
window.onclick = function(e) { console.log(e); //報(bào)錯(cuò)提示 };
會(huì)出現(xiàn)這樣的報(bào)錯(cuò)提示:[ts] Parameter :'e' implicitly has an 'any' type, but a better type may be inferred from usage.
,TS類(lèi)型檢查器使用window.onclick函數(shù)的類(lèi)型來(lái)推斷右邊函數(shù)表達(dá)式的類(lèi)型,從而推出e
參數(shù)的類(lèi)型,如果函數(shù)表達(dá)式不是在上下文類(lèi)型的位置,則參數(shù)e
具有any
類(lèi)型。我們知道,any表示任意類(lèi)型, 可以被任何類(lèi)型分配,也可以分配給任何類(lèi)型;任意類(lèi)型,是所有類(lèi)型的子類(lèi)型,當(dāng)被賦予any
類(lèi)型的時(shí)候,就意味著跟JS運(yùn)行一樣了。那這里怎么改呢?既然已經(jīng)提示了e
具有any
類(lèi)型,那就明確e
的類(lèi)型為any
就好了。一旦這個(gè)函數(shù)表達(dá)式有了明確的參數(shù)類(lèi)型注解,上下文類(lèi)型就會(huì)被忽略。
二、類(lèi)型斷言
類(lèi)型斷言是指:當(dāng)不確定一個(gè)聯(lián)合類(lèi)型的變量到底是哪種類(lèi)型的時(shí)候,我們只能訪問(wèn)這個(gè)聯(lián)合類(lèi)型的所有類(lèi)型里共有的屬性或者方法,但是有的時(shí)候就是需要在還不確定類(lèi)型的情況下就訪問(wèn)其中一個(gè)類(lèi)型的屬性和方法。類(lèi)型斷言可以用來(lái)手動(dòng)指定一個(gè)值的類(lèi)型。
類(lèi)型斷言不是類(lèi)型轉(zhuǎn)換,斷言成一個(gè)聯(lián)合類(lèi)型中不存在的類(lèi)型毫無(wú)疑問(wèn)是不被允許的。
語(yǔ)法:<類(lèi)型>值或者值 as 類(lèi)型。
舉個(gè)例子:
function getFullName(fullname: string | number): number { if (fullname.length) { return fullname.length; } else { return fullname.toString().length; } } getFullName('hhhhhhhhh')
如上代碼,看上去邏輯好像一點(diǎn)問(wèn)題也沒(méi)有,但是就是會(huì)給你報(bào)錯(cuò)Property 'length' does not exist on type 'string | number'
。這個(gè)時(shí)候,肯定不是換成JS來(lái)寫(xiě),而是通過(guò)類(lèi)型斷言來(lái)讓代碼順利執(zhí)行,改造如下:
function getFullName(fullname: string | number): number { // if ((<string>fullname).length) { if (fullname as string) { return (<string>fullname).length } else { return fullname.toString().length } } getFullName('hhhhhhhhh')
那么理解下面的代碼,對(duì)你來(lái)說(shuō)肯定就是小菜一碟啦~:
let greet: any = 'hello' let greetLength1: number = (<string>greet).length let greetLength2: number = (<string>greet).length console.log(greetLength1);//5 console.log(greetLength2);//5 ? interface Ob1 { name: string, } interface Ob2 { name: number, } let myOb: Ob1 | Ob1 = { name: '123' } let obLength: number = (<string>myOb.name).length console.log(obLength);//3
附:類(lèi)型別名
type Name = string; type NameResolver = () => string; type NameOrResolver = Name | NameResolver; function getName(n: NameOrResolver): Name { if (typeof n === 'string') { return n; } else { return n(); } }
總結(jié)
到此這篇關(guān)于TypeScript類(lèi)型推論與類(lèi)型斷言的文章就介紹到這了,更多相關(guān)TS類(lèi)型推論與類(lèi)型斷言?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)表格響應(yīng)式布局技巧
這篇文章主要為大家介紹了JS實(shí)現(xiàn)表格響應(yīng)式布局技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07JavaScript中this的全面解析及常見(jiàn)實(shí)例
這篇文章主要給大家介紹了關(guān)于JavaScript中this的全面解析及常見(jiàn)實(shí)例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05JavaScript實(shí)現(xiàn)圖片瀑布流和底部刷新
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)圖片瀑布流和底部刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01一個(gè)輕量級(jí)的XHTML右鍵菜單[支持IE和firefox]
一個(gè)輕量級(jí)的XHTML右鍵菜單[支持IE和firefox]...2007-01-01JS數(shù)組排序技巧匯總(冒泡、sort、快速、希爾等排序)
這篇文章主要介紹了JS數(shù)組排序技巧,實(shí)例匯總了JavaScript冒泡排序、sort排序、快速排序、希爾排序等,并附帶分析了sort排序的相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-11-11基于原生js運(yùn)動(dòng)方式關(guān)鍵點(diǎn)的總結(jié)(推薦)
下面小編就為大家?guī)?lái)一篇基于原生js運(yùn)動(dòng)方式關(guān)鍵點(diǎn)的總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10npm install jquery報(bào)錯(cuò)問(wèn)題解決
這篇文章主要為大家介紹了npm install jquery報(bào)錯(cuò)問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10JavaScript常用數(shù)學(xué)函數(shù)用法示例
這篇文章主要介紹了JavaScript常用數(shù)學(xué)函數(shù)用法,結(jié)合實(shí)例形式分析了JavaScript常見(jiàn)的對(duì)數(shù)、平方、絕對(duì)值、正弦、四舍五入等相關(guān)數(shù)學(xué)函數(shù)使用技巧,需要的朋友可以參考下2018-05-05解決遠(yuǎn)程頁(yè)面抓取中的亂碼問(wèn)題?
解決遠(yuǎn)程頁(yè)面抓取中的亂碼問(wèn)題?...2007-03-03javascript中將Object轉(zhuǎn)換為String函數(shù)代碼 (json str)
下面的代碼就是想將Object轉(zhuǎn)換為String函數(shù),需要的朋友可以參考下2012-04-04