Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript严格空检查:如何覆盖库约束?_Typescript - Fatal编程技术网

TypeScript严格空检查:如何覆盖库约束?

TypeScript严格空检查:如何覆盖库约束?,typescript,Typescript,我的代码使用的是async库,特别是这个回调类型(): 错误:(239,16)TS2345:类型为“null”的参数不能分配给类型为“Error”的参数 现在我不确定库类型定义是否错误,但假设它是错误的,并且接口应该用err可选定义,如下所示: interface AsyncResultCallback<T> { (err?: Error, result: T): void; } interface AsyncResultCallback{(err?:Error,result:T)

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

错误:(239,16)TS2345:类型为“null”的参数不能分配给类型为“Error”的参数

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

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

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

在这种情况下,
skipLibCheck
skipDefaultLibCheck
标志没有帮助,因为错误来自您的代码,而不是您正在使用的库

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

(1) 传递一个非空值:

cb(new Error(), someObject);
(2) 尝试扩充库:

import * as Async from "async";

declare global {
    interface AsyncResultCallback<T> {
        (err: Error | null, result: T): void;
    }
}
import*作为异步从“Async”导入;
宣布全球{
接口AsyncResultCallback{
(err:Error | null,result:T):void;
}
}

谢谢,(1)不是一个选项,因为它改变了代码的逻辑,可能会破坏应用程序,选项(2)可以工作,只是不完全是这样-但是
声明全局{…
可以工作。选项(3)是键入
cb
作为
any
,如果它作为参数出现,在我的例子中就是这样。它应该使用
声明模块工作“async”
,这也是正确的方法,因为使用
全局
“意味着“其他东西。使用
cb:any
工作,它也将与
cb:Function
一起工作,但是您失去了类型安全性。
声明模块“async”
给了我TS2671:无法扩充模块“async”,因为它解析为非模块实体。“。可能相关:哦,
async
模块将类型导出到全局命名空间?是,
cb(new Error(), someObject);
import * as Async from "async";

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