在 TypeScript 中,is
是一个 类型谓词,用来帮助 ts 编译器 收窄 变量的类型。
具体场景是,我们需要通过if
来判断某个变量的类型,从而针对特定的类型执行一些特定的操作。
一般情况下,变量的类型在定义时被确定,并且在使用时不会发生变化。
is
使得变量在 js 层面被类型判断后,在 ts 层面同步更新其类型信息。
下面是一个判断变量是否为空的函数:
function isNil<T>(v: T | undefined | null): boolean {
return v === undefined || v === null
}
如果我们要判断的变量本身就是联合了空的类型,即时它通过了 if 判断,在 if 内部还是联合了空的类型:
function test(v: number | undefined | null) {
if (!isNil(v)) {
console.log(Math.round(v))
}
}
当然对于一些内置的判断方式,例如typeof v === 'number'
,ts 已经默认支持了类型的自动收窄:
function test(v: number | undefined | null) {
if (typeof v === 'number') {
console.log(Math.round(v))
}
}
上述代码 ts 不会报错,并且能观察到变量的类型被收窄了:
所以现在就需要is
:帮助我们实现自定义类型判断方法的类型收窄。
稍微修改一下isNil
函数:
function isNil<T>(v: T | undefined | null): v is undefined | null {
return v === undefined || v === null
}
将原来标记函数返回值的boolean
改为 类型谓词,告诉 ts 函数返回值与类型变化之间的联系。
isNil
返回true
表示v
是undefined
类型或者null
类型,这样在if
内部变量的类型就会自动收窄。
评论区