TypeScript 詳解之 any 類型弃舒,unknown 類型癞埠,never 類型

any 類型

基本含義

any 類型表示沒有任何限制,該類型的變量可以賦予任意類型的值聋呢。

let x:any;

x = 1; // 正確
x = 'foo'; // 正確
x = true; // 正確

上面示例中苗踪,變量x的類型是any,就可以被賦值為任意類型的值削锰。

變量類型一旦設(shè)為any通铲,TypeScript 實(shí)際上會(huì)關(guān)閉這個(gè)變量的類型檢查。即使有明顯的類型錯(cuò)誤器贩,只要句法正確颅夺,都不會(huì)報(bào)錯(cuò)。

let x:any = 'hello';

x(1) // 不報(bào)錯(cuò)
x.foo = 100; // 不報(bào)錯(cuò)

上面示例中蛹稍,變量x的值是一個(gè)字符串吧黄,但是把它當(dāng)作函數(shù)調(diào)用,或者當(dāng)作對(duì)象讀取任意屬性唆姐,TypeScript 編譯時(shí)都不報(bào)錯(cuò)拗慨。原因就是x的類型是any,TypeScript 不對(duì)其進(jìn)行類型檢查。

由于這個(gè)原因赵抢,應(yīng)該盡量避免使用any類型剧蹂,否則就失去了使用 TypeScript 的意義。

實(shí)際開發(fā)中昌讲,any類型主要適用以下兩個(gè)場(chǎng)合国夜。

(1)出于特殊原因,需要關(guān)閉某些變量的類型檢查短绸,就可以把該變量的類型設(shè)為any车吹。

(2)為了適配以前老的 JavaScript 項(xiàng)目,讓代碼快速遷移到 TypeScript醋闭,可以把變量類型設(shè)為any窄驹。有些年代很久的大型 JavaScript 項(xiàng)目,尤其是別人的代碼证逻,很難為每一行適配正確的類型乐埠,這時(shí)你為那些類型復(fù)雜的變量加上any,TypeScript 編譯時(shí)就不會(huì)報(bào)錯(cuò)囚企。

總之丈咐,TypeScript 認(rèn)為,只要開發(fā)者使用了any類型龙宏,就表示開發(fā)者想要自己來處理這些代碼棵逊,所以就不對(duì)any類型進(jìn)行任何限制,怎么使用都可以银酗。

從集合論的角度看辆影,any類型可以看成是所有其他類型的全集,包含了一切可能的類型黍特。TypeScript 將這種類型稱為“頂層類型”(top type)蛙讥,意為涵蓋了所有下層。

類型推斷問題

對(duì)于開發(fā)者沒有指定類型灭衷、TypeScript 必須自己推斷類型的那些變量次慢,如果無法推斷出類型,TypeScript 就會(huì)認(rèn)為該變量的類型是any今布。

function add(x, y) {
  return x + y;
}

add(1, [1, 2, 3]) // 不報(bào)錯(cuò)

上面示例中经备,函數(shù)add()的參數(shù)變量xy,都沒有足夠的信息部默,TypeScript 無法推斷出它們的類型侵蒙,就會(huì)認(rèn)為這兩個(gè)變量和函數(shù)返回值的類型都是any。以至于后面就不再對(duì)函數(shù)add()進(jìn)行類型檢查了傅蹂,怎么用都可以纷闺。

這顯然是很糟糕的情況算凿,所以對(duì)于那些類型不明顯的變量,一定要顯式聲明類型犁功,防止被推斷為any氓轰。

TypeScript 提供了一個(gè)編譯選項(xiàng)noImplicitAny,打開該選項(xiàng)浸卦,只要推斷出any類型就會(huì)報(bào)錯(cuò)署鸡。

$ tsc --noImplicitAny app.ts

上面命令使用了noImplicitAny編譯選項(xiàng)進(jìn)行編譯,這時(shí)上面的函數(shù)add()就會(huì)報(bào)錯(cuò)限嫌。

污染問題

any類型除了關(guān)閉類型檢查靴庆,還有一個(gè)很大的問題,就是它會(huì)“污染”其他變量怒医。它可以賦值給其他任何類型的變量(因?yàn)闆]有類型檢查)炉抒,導(dǎo)致其他變量出錯(cuò)。

還有 70% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
支付 ¥3.99 繼續(xù)閱讀
  • 序言:七十年代末稚叹,一起剝皮案震驚了整個(gè)濱河市焰薄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扒袖,老刑警劉巖塞茅,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異季率,居然都是意外死亡凡桥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蚀同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啊掏,你說我怎么就攤上這事蠢络。” “怎么了迟蜜?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵刹孔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我娜睛,道長(zhǎng)髓霞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任畦戒,我火速辦了婚禮方库,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘障斋。我一直安慰自己纵潦,他們只是感情好徐鹤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邀层,像睡著了一般返敬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寥院,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天劲赠,我揣著相機(jī)與錄音,去河邊找鬼秸谢。 笑死凛澎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钮追。 我是一名探鬼主播预厌,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼元媚!你這毒婦竟也來了轧叽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤刊棕,失蹤者是張志新(化名)和其女友劉穎炭晒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甥角,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡网严,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗤无。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震束。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖当犯,靈堂內(nèi)的尸體忽然破棺而出垢村,到底是詐尸還是另有隱情,我是刑警寧澤嚎卫,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布嘉栓,位于F島的核電站,受9級(jí)特大地震影響拓诸,放射性物質(zhì)發(fā)生泄漏侵佃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一奠支、第九天 我趴在偏房一處隱蔽的房頂上張望馋辈。 院中可真熱鬧,春花似錦倍谜、人聲如沸首有。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)井联。三九已至卜壕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烙常,已是汗流浹背轴捎。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚕脏,地道東北人侦副。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驼鞭,于是被迫代替她去往敵國(guó)和親秦驯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容