您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TypeScript is 关键字

本节介绍 TypeScript 中的 is 关键字,它被称为类型谓词,用来判断变量属于某个接口或类型。如果需要封装类型判断,你应该第一时间想到它,本节列出了一些常用的类型判断以供参考。

is 关键字一般用于返回值类型中,判断参数是否属于某一类型,并根据结果返回对应的布尔类型。

语法:prop is type

在一些兑换码场景,经常会需要将兑换码全部转为大写,之后再进行判断:

function isString(s: unkn): boolean {
  return typeof s === 'string'
}

function toUpperCase(x: unkn) {
  if(isString(x)) {
    x.toUpperCase() // Error, Object is of type 'unkn'
  }
}

解释:

第 7 行,可以看到 TypeScript 抛出了, unkn 类型的对象不能进行 toUpperCase() 操作,可是在上一行明明已经通过 isString() 确认参数 x 为 string 类型,但是由于嵌套 TypeScript 不能进行正确的类型判断。

这时,就可以使用 is 关键字:

const isString = (s: unkn): s is string => typeof val === 'string'

function toUpperCase(x: unkn) {
  if(isString(x)) {
    x.toUpperCase()
  }
}

解释: 通过 is 关键字将类型范围缩小为 string 类型,这也是一种健壮性的约束规范。

下面是一些常用的类型判断:

const isNumber = (val: unkn): val is number => typeof val === 'number'
const isString = (val: unkn): val is string => typeof val === 'string'
const isSymbol = (val: unkn): val is symbol => typeof val === 'symbol'
const isFunction = (val: unkn): val is Function => typeof val === 'function'
const isObject = (val: unkn): val is Record<any, any> => val !== null && typeof val === 'object'

function isPromise<T = any>(val: unkn): val is Promise<T> {
  return isObject(val) && isFunction(val.then) && isFunction(val.catch)
}

const objectToString = Object.prototype.toString
const toTypeString = (value: unkn): string => objectToString.call(value)
const isPlainObject = (val: unkn): val is object => toTypeString(val) === '[object Object]'

is 关键字经常用来封装"类型判断",通过和返回值的比较,从而缩小参数的类型范围,所以类型谓词 is 也是一种类型保护。


联系我
置顶