您好,登錄后才能下訂單哦!
這篇文章主要介紹“TypeScript中unknown和any的區(qū)別有哪些”,在日常操作中,相信很多人在TypeScript中unknown和any的區(qū)別有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”TypeScript中unknown和any的區(qū)別有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
我們知道 any
類型的變量可以被賦給任何值。
let myVar: any = 0; myVar = '1'; myVar = false;
TypeScript 指南并不鼓勵使用 any
,因為使用它就會丟掉類型限制--而需要類型限制也是我們選擇 TypeScript 的一個原因,所以就是有點背道而馳。
TypeScript(3.0 及以上版本)還提供了一種類似于 any
的特殊類型 unknown
。 我們也可以為 unknown
類型變量分配任何值:
let myVar: unknown = 0; myVar = '1'; myVar = false;
那現(xiàn)在就有一個問題了, any
和 unknown
有啥區(qū)別?
為了更好地理解 unknown
和 any
之間的區(qū)別,我們先從編寫一個想要調(diào)用其唯一參數(shù)的函數(shù)開始。
我們將 invokeAnything()
的唯一參數(shù)設(shè)置為 any
類型
function invokeAnything(callback: any) { callback(); } invokeAnything(1); // throws "TypeError: callback is not a function"
因為 callback
參數(shù)是任何類型的,所以語句 callback()
不會觸發(fā)類型錯誤。我們可以用any
類型的變量做任何事情。
但是運行會拋出一個運行時錯誤:TypeError: callback is not a function
。1
是一個數(shù)字,不能作為函數(shù)調(diào)用,TypeScript并沒有保護代碼避免這個錯誤
那既允許 invokeAnything()
函數(shù)接受任何類型的參數(shù),又要強制對該參數(shù)進行類型檢查防止上面這種報錯,要怎么做呢?
有請 unknown
大哥來控場。
與 any
一樣,unknown
變量接受任何值。但是當嘗試使用 unknown
變量時,TypeScript 會強制執(zhí)行類型檢查。這不就是我們想要的嘛。
function invokeAnything(callback: unknown) { callback(); // Object is of type 'unknown' } invokeAnything(1);
因為 callback
參數(shù)的類型是 unknown
,所以語句 callback()
有一個類型錯誤 :Object is of type 'unknown'
。 與 any
相反,TypeScript會保護我們不調(diào)用可能不是函數(shù)的東西。
在使用一個 unknown
類型的變量之前,你需要進行類型檢查。在這個例子中,我們只需要檢查callback
是否是一個函數(shù)類型。
function invokeAnything(callback: unknown) { if (typeof callback === 'function') { callback(); } } invokeAnything(1);
說實話,當我學(xué)習(xí)的時候,我很難理解 unknown
。它與 any
有什么不同,因為這兩種類型都接受任何值
下面是幫助我理解兩者區(qū)別的規(guī)則:
可以將任何東西賦給 unknown
類型,但在進行類型檢查或類型斷言之前,不能對 unknown
進行操作
可以把任何東西分配給any
類型,也可以對any
類型進行任何操作
上面的例子正好說明了 unknown
和 `any 之間的相似和不同。
unknown
示例:
function invokeAnything(callback: unknown) { // 可以將任何東西賦給 `unknown` 類型, // 但在進行類型檢查或類型斷言之前,不能對 `unknown` 進行操作 if (typeof callback === 'function') { callback(); } } invokeAnything(1); // You can assign anything to `unknown` type
類型檢查 typeof callback === 'function'
,檢查 callback
是否為函數(shù),如果是,則可以調(diào)用。
any
示例:
function invokeAnything(callback: any) { // 可以對 `any` 類型執(zhí)行任何操作 callback(); } invokeAnything(1); // 可以把任何東西分配給`any`類型
如果 callback
是 any
, TypeScript 就不會強制 callback()
語句進行任何類型檢查。
到此,關(guān)于“TypeScript中unknown和any的區(qū)別有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。