Node.js TypeScript:正确指定回调err、res类型

Node.js TypeScript:正确指定回调err、res类型,node.js,typescript,callback,Node.js,Typescript,Callback,所以我有一个函数,它要么调用cb并产生一个错误,要么产生一个结果。TypeScript不喜欢cb(err,null): 函数foo(cb:(err:Error | null,结果:MyType)){ 试一试{ const result=getResultSomehow(); cb(空,结果); }捕捉(错误){ cb(err,null)//类型为“null”的参数不能分配给类型为MyType的参数 } 现在这是有意义的,我可以通过改变函数的签名来修复它:函数foo(cb:(err:Error

所以我有一个函数,它要么调用cb并产生一个错误,要么产生一个结果。TypeScript不喜欢cb(err,null):

函数foo(cb:(err:Error | null,结果:MyType)){ 试一试{ const result=getResultSomehow(); cb(空,结果); }捕捉(错误){ cb(err,null)//类型为“null”的参数不能分配给类型为MyType的参数 } 现在这是有意义的,我可以通过改变函数的签名来修复它:
函数foo(cb:(err:Error | null,result:MyType | null))
但我不希望这样,因为现在这个函数的调用者突然必须检查结果是否为null。但我希望他们只检查err,如果err为null,那么result必须有一个值(类似于NodeJS函数,如
fs.readFile

我如何用打字脚本来表达这个


我确实检查了
fs.readFile
的类型,它的类型与我的函数类似,结果参数
data
是一个
缓冲区,不是可选的,也不是空的。但是由于它们的实现是纯JS的,我想它们不会遇到我遇到的TypeScript错误(?)有趣的问题-问题是你不能强迫
foo
的调用者不访问
result
并阻止他/她认为
result
是在发生错误的情况下定义的,除非你这样做
result:MyType | null
。也许他/她认为即使发生错误,
foo
返回结果

话虽如此,我明白你的意思,你可以通过以下方法来解决这个问题:

function foo(cb: (err: Error | null, result: MyType) => void) {
   try {
     const result = getResultSomehow();
     cb(null, result);
   } catch(err) {
     cb(err, null as any);
   }
}

但是,您应该记录这一点,以便调用者知道,如果出现错误,
结果
将始终为

请共享可复制的示例模糊任何!谢谢