TypeScript is 關鍵字
本節介紹 TypeScript 中的 is
關鍵字,它被稱為類型謂詞,用來判斷一個變量屬于某個接口或類型。如果需要封裝一個類型判斷函數,你應該第一時間想到它,本節列出了一些常用的類型判斷函數以供參考。
1. 慕課解釋
is
關鍵字一般用于函數返回值類型中,判斷參數是否屬于某一類型,并根據結果返回對應的布爾類型。
語法:prop is type
2. 舉例說明
在一些兌換碼場景,經常會需要將兌換碼全部轉為大寫,之后再進行判斷:
function isString(s: unknown): boolean {
return typeof s === 'string'
}
function toUpperCase(x: unknown) {
if(isString(x)) {
x.toUpperCase() // Error, Object is of type 'unknown'
}
}
代碼解釋:
第 7 行,可以看到 TypeScript 拋出了一個錯誤提示,一個 unknown 類型的對象不能進行 toUpperCase() 操作,可是在上一行明明已經通過 isString()
函數確認參數 x 為 string 類型,但是由于函數嵌套 TypeScript 不能進行正確的類型判斷。
這時,就可以使用 is
關鍵字:
const isString = (s: unknown): s is string => typeof val === 'string'
function toUpperCase(x: unknown) {
if(isString(x)) {
x.toUpperCase()
}
}
解釋: 通過 is 關鍵字將類型范圍縮小為 string 類型,這也是一種代碼健壯性的約束規范。
3. 一些拓展函數
下面是一些常用的類型判斷函數:
const isNumber = (val: unknown): val is number => typeof val === 'number'
const isString = (val: unknown): val is string => typeof val === 'string'
const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'
const isFunction = (val: unknown): val is Function => typeof val === 'function'
const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'
function isPromise<T = any>(val: unknown): val is Promise<T> {
return isObject(val) && isFunction(val.then) && isFunction(val.catch)
}
const objectToString = Object.prototype.toString
const toTypeString = (value: unknown): string => objectToString.call(value)
const isPlainObject = (val: unknown): val is object => toTypeString(val) === '[object Object]'
4. 小結
is
關鍵字經常用來封裝"類型判斷函數",通過和函數返回值的比較,從而縮小參數的類型范圍,所以類型謂詞 is 也是一種類型保護。