亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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 也是一種類型保護。