日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
TypeScript中的Any、Unknown、Never和Void

大家好,我是前端西瓜哥。今天來(lái)學(xué)習(xí) TS 中幾個(gè)比較特殊的類(lèi)型:any、never、never、void。

朔城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),朔城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為朔城近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的朔城做網(wǎng)站的公司定做!

any

any 表示 任意類(lèi)型

它是任意類(lèi)型的父類(lèi),任意類(lèi)型的值都可以賦予給 any 類(lèi)型:

// 編譯不會(huì)報(bào)錯(cuò)
let anything: any = '前端西瓜哥';

let flag: boolean = true;
anything = flag;

anything = { num: 2 };

它可以表示任何類(lèi)型,并使用它們的語(yǔ)法,就像寫(xiě)沒(méi)有類(lèi)型的原生 JS 一樣。

// 編譯不會(huì)報(bào)錯(cuò)
const a: any = 6;

a();
a.key1 = true;

any 相當(dāng)于拋棄了類(lèi)型系統(tǒng),會(huì)讓代碼變得不可預(yù)測(cè)和難以維護(hù),需要程序員小心維護(hù),一有不慎會(huì)造成運(yùn)行時(shí)的錯(cuò)誤,所以盡量少用。

但在引入一些沒(méi)有提供類(lèi)型的第三方純 JS 庫(kù)時(shí),還是得將它們標(biāo)為 any,這個(gè)確實(shí)沒(méi)啥辦法。

除非你自己給第三方庫(kù)寫(xiě)類(lèi)型聲明,但太不現(xiàn)實(shí),因?yàn)槟悴皇煜さ谌綆?kù)的 API,且可能有很復(fù)雜的類(lèi)型推導(dǎo)要實(shí)現(xiàn)。

any 的存在是為了兼容無(wú)類(lèi)型的 JS。TS 作為 JS 的超集,用 any 開(kāi)后門(mén)是不得不做的事情。

unknown

unknown 可以認(rèn)為是 類(lèi)型更安全的 any。

和 any 一樣,unknown 也是任何類(lèi)型的子類(lèi)型,所有類(lèi)型都可以傳給 unknown,包括 any。

// 編譯不會(huì)報(bào)錯(cuò)
let a: unknown = '前端西瓜哥';

let b: any;
a = b;

a = { num: 2 };

說(shuō) unknown 更安全,是因?yàn)?nbsp;unknown 是不能進(jìn)行任何操作的。如果要使用,需要用 as 來(lái)進(jìn)行顯式的類(lèi)型斷言。

declare const user: known;

// 報(bào)錯(cuò),unknown 不能被使用
user.toLowerCase();

// 開(kāi)發(fā)者認(rèn)為 user 是個(gè)字符串
// 使用 as 進(jìn)行類(lèi)型推斷才能使用
(user as string).toLowerCase();

或者我們可以用類(lèi)型收窄(Type Narrowing);

declare const user: unknown;

if (typeof user === 'string') {
user.toLowerCase();
}

對(duì)于一些可疑的沒(méi)有類(lèi)型的變量,如果你不希望它被不小心使用,此時(shí)就可以用 unknown。

總結(jié)就是:unknown 能看不能用,想用先類(lèi)型斷言。

never

never 表示一個(gè) 無(wú)法被觀測(cè)的類(lèi)型,被賦予了該類(lèi)型的變量什么都不能做。

使用 never 的一些場(chǎng)景。

(1)一個(gè)無(wú)法走到 return 返回值的函數(shù),比如一定會(huì)拋出錯(cuò)誤或死循環(huán):

// 這里的 never 表示無(wú)法執(zhí)行到函數(shù)返回它的返回值
function foo(): never {
throw new Error('something wrong!')
}

(2)TS 在判斷條件下會(huì)做類(lèi)型的收窄,當(dāng)類(lèi)型收縮到無(wú)類(lèi)型可用,類(lèi)型就變成了 never:

function getData(id: number | string) {
if (typeof id === 'string') {
// id 類(lèi)型變成了 string
} else if (typeof id === 'number') {
// id 類(lèi)型變成了 number
} else {
// id 類(lèi)型變成了 never
}
}

或者做了一種不可能為 true 的類(lèi)型收窄:

if (typeof id === 'number' && typeof id === 'string') {
// id 不可能同時(shí)是 number 和 string
// 所以會(huì)變成 never
}

或無(wú)法求出交集的交叉類(lèi)型:

// ImpossibleType 會(huì)得到 never
type ImpossibleType = string & number;

(3)類(lèi)型編程中,在做模式匹配時(shí),如果匹配失敗,還是要返回一個(gè)類(lèi)型的。為了表示失敗,返回一個(gè) never 表示返回的類(lèi)型是無(wú)法被使用的。

比如 TS 內(nèi)置的 Parameters 高級(jí)類(lèi)型,會(huì)通過(guò)模式匹配提取函數(shù)的參數(shù)數(shù)組類(lèi)型。如果無(wú)法匹配到參數(shù),會(huì)返回 never:

type Parameters any> = T extends (...args: infer P) => any ? P : never

(4)類(lèi)型編程中,將一些類(lèi)型丟棄。never 在聯(lián)合類(lèi)型以及重映射的 key 中會(huì)被丟棄。

比如 TS 內(nèi)置的 Exclude 高級(jí)類(lèi)型,會(huì)將聯(lián)合類(lèi)型 T 中的不屬于 U 的 key 丟棄掉。

type Exclude = T extends U ? never : T

type T = Exclude<"a" | "b" | "c", "a">;
// T 的類(lèi)型為 "b" | "c"
// 其實(shí)應(yīng)該是 never | "b" | "c",但 never 無(wú)意義,被丟掉了

void

void 用于表示一個(gè) 函數(shù)沒(méi)有返回值。

function sayHi(): void {
console.log('Hi!');
}

當(dāng)然在實(shí)際 JS 運(yùn)行時(shí),還是會(huì)返回一個(gè)默認(rèn)的 undefined 的。但 TS 給返回值設(shè)置為 void,語(yǔ)義更好些。

總結(jié)

any 是任意類(lèi)型,具有所有類(lèi)型的行為,可被執(zhí)行,可訪(fǎng)問(wèn)屬性,超脫于類(lèi)型系統(tǒng)之外。

unknown 則是類(lèi)型更安全的 any,同樣可以將任何類(lèi)型賦給它,但不能執(zhí)行任何操作,必須用類(lèi)型斷言來(lái)顯示說(shuō)明類(lèi)型才能去執(zhí)行操作。

never 是無(wú)法觀測(cè)的類(lèi)型,比如不會(huì)執(zhí)行完的函數(shù)的返回值,合并結(jié)果不存在的交叉類(lèi)型。在類(lèi)型編程中非?;钴S,常用于丟棄一些子類(lèi)型。

void 就比較簡(jiǎn)單,只是代表函數(shù)沒(méi)有返回值,沒(méi)有其他的場(chǎng)景了。


文章名稱(chēng):TypeScript中的Any、Unknown、Never和Void
文章路徑:http://www.5511xx.com/article/dpospcc.html