Node.js TypeScript:正确指定回调err、res类型
所以我有一个函数,它要么调用cb并产生一个错误,要么产生一个结果。TypeScript不喜欢cb(err,null): 函数foo(cb:(err:Error | null,结果:MyType)){ 试一试{ const result=getResultSomehow(); cb(空,结果); }捕捉(错误){ cb(err,null)//类型为“null”的参数不能分配给类型为MyType的参数 } 现在这是有意义的,我可以通过改变函数的签名来修复它: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
函数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);
}
}
但是,您应该记录这一点,以便调用者知道,如果出现错误,结果
将始终为空
请共享可复制的示例模糊任何!谢谢