【问题标题】:TypeScript strict null checks: how to override library constraint?TypeScript 严格的空检查:如何覆盖库约束?
【发布时间】:2017-03-12 16:44:56
【问题描述】:

我的代码正在使用async 库,特别是这个回调类型(source):

interface AsyncResultCallback<T> { (err: Error, result: T): void; }

在我启用了strictNullChecks 的 TypeScript 代码中,这样调用它会失败:

cb(null, someObject);

错误:(239, 16) TS2345: 'null' 类型的参数不可分配给'Error' 类型的参数。

现在我不确定库类型定义是否错误,但假设是错误的,接口应该使用err 可选定义,如下所示:

interface AsyncResultCallback<T> { (err?: Error, result: T): void; }

如何说服 TypeScript 允许将 null 作为回调的第一个参数传递?我已经尝试过"skipLibCheck": true"skipDefaultLibCheck": true,但没有任何乐趣。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    skipLibCheckskipDefaultLibCheck 标志在这种情况下无济于事,因为错误来自您的代码而不是您正在使用的库。

    你有两个选择(我能想到的):

    (1) 传递一个非空值:

    cb(new Error(), someObject);
    

    (2) 尝试扩充库:

    import * as Async from "async";
    
    declare global {
        interface AsyncResultCallback<T> {
            (err: Error | null, result: T): void;
        }
    }
    

    【讨论】:

    • 谢谢,(1) 不是一个选项,因为它会改变代码的逻辑并可能破坏应用程序,选项 (2) 有效,但不完全是这样 - 但 declare global { ... 有效。选项 (3) 是将 cb 键入为 any 如果它作为参数出现,在我的例子中就是这样。
    • 它应该使用declare module "async" 工作,这也是这样做的正确方法,因为使用global“意味着”其他东西。使用cb: any 可以工作,它也可以和cb: Function 一起工作,但是你失去了类型安全性。
    • declare module "async" 给了我“TS2671:无法扩充模块‘异步’,因为它解析为非模块实体。”。可能相关:github.com/Microsoft/TypeScript/issues/7148
    • 哦,async 模块将类型导出到全局命名空间?
    猜你喜欢
    • 2020-04-05
    • 2019-03-23
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多