如何使TypeScript类型保护器没有任何对象?

保罗·梅里尔

我正在使用typescript-eslint v3.1.0,并且在TypeScript中具有以下类型保护功能:

interface JWTPayload {
    sub: number;
}

function isJWTPayload(obj: unknown): obj is JWTPayload {
    if (typeof obj !== 'object') {
        return false;
    }

    // eslint-disable-next-line @typescript-eslint/ban-types
    const obj2 = obj as object;

    if (!('sub' in obj2)) {
        return false;
    }

    const obj3 = obj2 as JWTPayload;

    if (!Number.isInteger(obj3.sub)) {
        return false;
    }

    return true;
}

我的问题是这样的:在我认为是常见的情况下,禁用皮棉规则并不好。是否有可以避免这种情况的TypeScript模式?

一些背景:

https://github.com/typescript-eslint/typescript-eslint/pull/848引入了被禁用的typescript-eslint规则,其中规定“ 99.9%的时间,您不想使用[“ object”类型],而绝大多数代码库都不想使用它“。他们为什么这么说呢?似乎在验证用户输入时都会使用它。还有其他方法可以不强制转换为“ any”吗?

瓦列里·卡特科夫(Valeriy Katkov)

typeof 本身就是类型保护者因此,您只需将逻辑移到if块内即可:

function isJWTPayload(obj: unknown): obj is JWTPayload {
    if (typeof obj === 'object' && obj) {
        if (!('sub' in obj)) {
            return false;
        }

        const payload = obj as JWTPayload;
        if (Number.isInteger(payload.sub)) {
            return true;
        }
    }

    return false;
}

操场

我也将删除!('sub' in obj)支票,因为它没有意义。如果subundefined,则也Number.isInteger(undefined)返回false

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类未使用标头保护器命名类型

如何轻松关闭Linux内核中的堆栈保护器?

如何实现在退出作用域时恢复价值的作用域保护器?

有没有办法使用角度文件保护程序下载任何类型的文件?

TypeScript:JSX元素类型没有任何构造或调用签名

Allegro 5-宇宙保护器演示

宝石“保护器”在铁轨中的控制动作

电涌保护器的接地灯熄灭

如何为没有任何类型的文件设置文件类型

在目标文件中带有“ U”未定义符号类型的程序如何编译而没有任何链接器错误?

在返回嵌套对象时,Typescript没有返回嵌套类型

带有 Typescript 的变量类型保护

元素隐式具有“任何”类型,因为类型对象没有索引签名

如何使用TypeScript保护域驱动的类型?

如何基于现有对象值定义Typescript对象类型?

如何从没有任何“名称”的对象获取值?

如果没有任何对象创建,变量“a”将如何存在?

建议在Typescript中使用哪个?类类型对象还是具有许多参数的任何类型?

对象类型的TypeScript索引签名隐式具有任何类型

是否有一个表示具有任何属性但没有数组的对象的类型

TypeScript 类型“对象”与对象接口,为什么没有“数组”类型?

如何键入“任何对象”类型?

有没有一种方法可以为Typescript中的嵌套键访问创建类型保护?

无法在Typescript中编写高阶组件:JSX元素类型没有任何构造或调用签名

尝试编写TypeScript定义文件-JSX元素类型'SideMenu'没有任何构造或调用签名

TypeScript 3:JSX元素类型“ Component”没有任何构造或调用签名。[2604]

TypeScript 1.6错误:JSX元素类型XXX没有任何构造或调用签名

库没有任何可下载类型时出现Typescript错误

TypeScript 错误:JSX 元素类型“MultiSelect”没有任何构造或调用签名