侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

ts 类型谓词 is 的用法

barwe
2022-08-22 / 1 评论 / 7 点赞 / 5,216 阅读 / 778 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在 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))
    }
}

image-20220822101913487

当然对于一些内置的判断方式,例如typeof v === 'number',ts 已经默认支持了类型的自动收窄:

function test(v: number | undefined | null) {
    if (typeof v === 'number') {
        console.log(Math.round(v))
    }
}

上述代码 ts 不会报错,并且能观察到变量的类型被收窄了:

image-20220822102139878

所以现在就需要is帮助我们实现自定义类型判断方法的类型收窄

稍微修改一下isNil函数:

function isNil<T>(v: T | undefined | null): v is undefined | null {
    return v === undefined || v === null
}

将原来标记函数返回值的boolean改为 类型谓词,告诉 ts 函数返回值与类型变化之间的联系。

isNil返回true表示vundefined类型或者null类型,这样在if内部变量的类型就会自动收窄。

image-20220822102651116

7

评论区