TypeScript類型推論與類型斷言實(shí)例詳解
一、類型推論
類型推論,顧名思義就是指類型在哪里如何被推斷。在TS語(yǔ)法中,如果有些沒地方有明確指出類型,類型推論就會(huì)幫助提供類型,即聲明變量時(shí),不賦給類型,就會(huì)觸發(fā)類型推論。
1、最佳通用類型
最佳通用類型就是指,在一個(gè)或者多個(gè)表達(dá)式中,變量的類型會(huì)從這些表達(dá)式中的所有類型來(lái)推斷出一個(gè)最合適的通用類型。
舉個(gè)例子:
let brand = 'YSL' brand = 123
當(dāng)定義一個(gè)變量brand
,變量brand的類型被推斷為字符串,但是后來(lái)修改值為另外一種類型,如number,boolean等,TS就會(huì)很貼心的提示不能將其他類型分配給字符串。然而這只是從單個(gè)表達(dá)式里面推斷,如果是多個(gè)表達(dá)式呢?又會(huì)如何推斷呢?例如:
let money = [1, 'yuan', null] money = [123] money = ['hello'] money = [null]? ? money = [{ name: 'ducky' }]//錯(cuò)誤提示
可見,當(dāng)需要從幾個(gè)表達(dá)式中推斷類型時(shí)候,會(huì)使用這些表達(dá)式的類型來(lái)推斷出一個(gè)最合適的通用類型---稱為最佳通用類型。當(dāng)有多個(gè)表達(dá)式時(shí),為了推斷money
的類型,必須要考慮所有元素的類型。 這里有三種選擇: number
,string
和null
。 計(jì)算通用類型算法會(huì)考慮所有的候選類型,并給出一個(gè)兼容所有候選類型的類型。那如果想要的類型不在候選名單上,又該如何推論呢?例如:
function Animal() { console.log('animal'); } function Food() { console.log('food'); } function Fruit() { console.log('fruit'); } let target= [new Animal(), new Food(), new Fruit()]
如果想讓terget
的類型被推斷為People[]
類型,但是數(shù)組里的候選類型有三種,沒有People[]
類型,這肯定是不能推斷出結(jié)果的。那怎么辦呢?這種情況下,當(dāng)候選類型不能使用的時(shí)候,我們必須明確地指出類型:
let target:People[]= [new Animal(), new Food(), new Fruit()]
此時(shí),如果沒有找到最佳通用類型的話,target
會(huì)被推斷為聯(lián)合數(shù)組類型:(Animal|Food|Fruit)[]
2、上下文類型
上下文類型取決于表達(dá)式的類型和其所處的位置,例如:
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類型檢查器使用window.onclick函數(shù)的類型來(lái)推斷右邊函數(shù)表達(dá)式的類型,從而推出e
參數(shù)的類型,如果函數(shù)表達(dá)式不是在上下文類型的位置,則參數(shù)e
具有any
類型。我們知道,any表示任意類型, 可以被任何類型分配,也可以分配給任何類型;任意類型,是所有類型的子類型,當(dāng)被賦予any
類型的時(shí)候,就意味著跟JS運(yùn)行一樣了。那這里怎么改呢?既然已經(jīng)提示了e
具有any
類型,那就明確e
的類型為any
就好了。一旦這個(gè)函數(shù)表達(dá)式有了明確的參數(shù)類型注解,上下文類型就會(huì)被忽略。
二、類型斷言
類型斷言是指:當(dāng)不確定一個(gè)聯(lián)合類型的變量到底是哪種類型的時(shí)候,我們只能訪問(wèn)這個(gè)聯(lián)合類型的所有類型里共有的屬性或者方法,但是有的時(shí)候就是需要在還不確定類型的情況下就訪問(wèn)其中一個(gè)類型的屬性和方法。類型斷言可以用來(lái)手動(dòng)指定一個(gè)值的類型。
類型斷言不是類型轉(zhuǎn)換,斷言成一個(gè)聯(lián)合類型中不存在的類型毫無(wú)疑問(wèn)是不被允許的。
語(yǔ)法:<類型>值或者值 as 類型。
舉個(gè)例子:
function getFullName(fullname: string | number): number { if (fullname.length) { return fullname.length; } else { return fullname.toString().length; } } getFullName('hhhhhhhhh')
如上代碼,看上去邏輯好像一點(diǎn)問(wèn)題也沒有,但是就是會(huì)給你報(bào)錯(cuò)Property 'length' does not exist on type 'string | number'
。這個(gè)時(shí)候,肯定不是換成JS來(lái)寫,而是通過(guò)類型斷言來(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
附:類型別名
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類型推論與類型斷言的文章就介紹到這了,更多相關(guān)TS類型推論與類型斷言內(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的全面解析及常見實(shí)例
這篇文章主要給大家介紹了關(guān)于JavaScript中this的全面解析及常見實(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é)(推薦)。小編覺得挺不錯(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常見的對(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