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

