ts中any和unknow的區(qū)別及說明
前言
在開發(fā)中,尤其在 react 項(xiàng)目中,一般都是會(huì)使用 ts 的,但是如果 ts 使用不當(dāng),就會(huì)出現(xiàn)很多any,也就是很多人笑成 typescript = anyscript,例如下面這段代碼:
export interface Person {
name: any;
age: any;
sex: any;
}很多使用一些簡單的類型定義,比如 number、boolean、string 可能我們還想寫一下,但是遇到一些復(fù)雜的比如對(duì)象、promise,由于影響速度就直接使用 any 代替了,當(dāng)然這樣確實(shí)比較方便,但是一昧的使用 any,ts 就失去了意義,盡管 ts 官方鼓勵(lì)大家使用 any。
而且有的領(lǐng)導(dǎo)在 cr 時(shí),很討厭看到 any,如果有 any 是不給通過的。
那和any相似的還有一個(gè)unknow,本文就為大家簡單介紹一下,何時(shí)使用any何時(shí)使用unknow。
any
首先,讓我們來看看 any 類型。any 可以說是 ts 中最靈活的類型,它允許我們對(duì)該類型的值進(jìn)行任何操作,而不會(huì)觸發(fā)類型檢查。
這樣我們就可以將任何類型的值賦給 any 類型的變量,也可以將 any 類型的值賦給其他任何類型的變量。這種靈活性就使得 any 成為了一把雙刃劍。
舉個(gè)栗子:
let myAny: any = 42; myAny = "Hello, world!"; myAny = true; myAny = [1, 2, 3]; let myNumber: number = myAny; // 不會(huì)報(bào)錯(cuò) console.log(myAny.nonExistentMethod()); // 不會(huì)在編譯時(shí)報(bào)錯(cuò),但可能在運(yùn)行時(shí)報(bào)錯(cuò)
在這個(gè)栗子中,我們可以看到 any 類型的變量可以被賦予任何類型的值,而且可以被賦給其他類型的變量,甚至竟然還可以調(diào)用不存在的方法而不會(huì)在編譯時(shí)報(bào)錯(cuò)。這種自由度雖然方便,但也容易導(dǎo)致潛在的運(yùn)行時(shí)錯(cuò)誤。
那么相比之下,unknown 類型則更加嚴(yán)格和安全。unknown 可以被認(rèn)為是類型安全版本的 any。它同樣可以接受任何類型的值,但是在使用 unknown 類型的值時(shí),我們必須先進(jìn)行類型檢查或類型斷言。
unknown
來看一個(gè) unknown 的栗子:
let myUnknown: unknown = 42;
myUnknown = "Hello, world!";
myUnknown = true;
myUnknown = [1, 2, 3];
// let myNumber: number = myUnknown; // 這行會(huì)報(bào)錯(cuò)
// console.log(myUnknown.length); // 這行也會(huì)報(bào)錯(cuò)
if (typeof myUnknown === "string") {
console.log(myUnknown.toUpperCase());
}
let myString: string = myUnknown as string; // 使用類型斷言在這個(gè)栗子中,我們可以看到 unknown 類型的變量同樣可以接受任何類型的值。但是,我們不能直接將 unknown 類型的值賦給其他類型的變量,也不能直接訪問 unknown 類型值的屬性或方法。我們必須先進(jìn)行類型檢查( if 語句中的類型檢查)或使用類型斷言 as。
什么情況下使用any或者unknow
那么,我們應(yīng)該在什么情況下使用 any,什么情況下使用 unknown 呢?
當(dāng)我們真的不知道變量的類型,并且需要在代碼中頻繁地使用該變量而不進(jìn)行類型檢查時(shí),可以使用 any。比如在處理來自第三方庫的數(shù)據(jù),或者在遷移 js 項(xiàng)目到 ts 的過程中,any 可能會(huì)很有用。
但是,一昧的使用 any 會(huì)導(dǎo)致我們失去 ts 帶來的類型安全性優(yōu)勢(shì)。所以,在大多數(shù)情況下,我們應(yīng)該優(yōu)先考慮使用 unknown。當(dāng)我們不確定一個(gè)值的類型,但又想保持類型安全性時(shí),unknown 是一個(gè)很好的選擇。
使用 unknown 可以強(qiáng)制我們?cè)谑褂迷撝抵斑M(jìn)行必要的類型檢查,這有助于捕獲潛在的類型錯(cuò)誤,提高代碼的健壯性。
總結(jié)
總的來說,any 和 unknown 都為 ts 中的類型系統(tǒng)提供了一定的靈活性,但 unknown 更加注重類型安全。在實(shí)際開發(fā)中,我們應(yīng)該盡量減少 any 的使用,多考慮使用 unknown,以充分利用 ts 的類型檢查功能,寫出更安全、更可靠的代碼。
下次再想用 any 時(shí),先問問自己:這里真的沒法確定類型嗎?用 unknown 會(huì)不會(huì)更安全?畢竟寫 ts 的樂趣,不就是在類型系統(tǒng)的鋼絲上優(yōu)雅地跳舞嗎?
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中字符串和字符串拼接操作實(shí)例代碼
這篇文章主要介紹了JavaScript中字符串和字符串拼接操作的相關(guān)資料,文中通過示例代碼詳解講解了創(chuàng)建方式、不可變性及長度屬性,包括+、+=、concat()、模板字符串拼接方法,需要的朋友可以參考下2025-05-05
js判斷請(qǐng)求的url是否可訪問,支持跨域判斷的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨s判斷請(qǐng)求的url是否可訪問,支持跨域判斷的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
[js+css]點(diǎn)擊隱藏層,點(diǎn)擊另外層不能隱藏原層
[js+css]點(diǎn)擊隱藏層,點(diǎn)擊另外層不能隱藏原層...2007-03-03
簡單方法判斷JavaScript對(duì)象為null或者屬性為空
對(duì)已聲明但未初始化的和未聲明的變量執(zhí)行typeof,都返回undefined,null表示一個(gè)空對(duì)象指針,typeof操作會(huì)返回object2014-09-09

