[TS手冊學習] 02_類型收窄 Narrowing
TS官方手冊:TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org)
一個變量如果聲明為聯(lián)合類型,而后續(xù)操作需要針對其具體的單一類型做不同處理,這個過程就叫做類型收窄(Narrowing)。
常見的做法或情形有以下:
typeof 類型保護(type guards)
typeof是 JS 中的操作符,需要注意typeof對象、數(shù)組、null都會返回object。
真值收窄(Truthiness narrowing)
0,NaN,"",0n,null,undefined都會被隱式轉(zhuǎn)換為false,屬于假值,其它的值是真值。依據(jù)這個規(guī)則也可以收窄類型。
等值收窄(Equality narrowing)
在 JS 中,全等判斷符===要求兩邊類型一致,以此也可以排除一些類型,從而實現(xiàn)收窄類型。
in 操作符收窄
in操作符檢查指定的屬性是否在指定的對象或其原型鏈中。
instanceof 收窄
instanceof運算符用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上。
賦值語句(Assignments)
TS 可以根據(jù)賦值語句的右值的類型收窄左值。
控制流分析(Control flow analysis)
基于可達性的代碼分析就是控制流分析,關(guān)注代碼中的if,while等條件控制語句。
如果代碼達到了某個區(qū)域,而根據(jù)條件控制語句可以得知:如果變量X是類型A,無法到達此區(qū)域,那么就可以推斷出到達此區(qū)域的變量X的類型不可能是A。
于是類型收窄。
function padLeft(padding: number | string, input: string) {
if (typeof padding === "number") {
return new Array(padding + 1).join(" ") + input;
}
return padding + input;
}
在第一個 if 語句里,因為有 return 語句,TypeScript 就能通過代碼分析,判斷出在剩余的部分 return padding + input ,如果 padding 是 number 類型,是無法達到 (unreachable) 這里的,所以在剩余的部分,就會將 number類型從 number | string 類型中刪除掉。

浙公網(wǎng)安備 33010602011771號