【问题标题】:TypeScript: specify callback err, res types properlyTypeScript:指定回调错误,res 类型正确
【发布时间】:2021-03-27 16:55:16
【问题描述】:

所以我有这个函数,它调用 cb 时出现错误或结果。 TypeScript 不喜欢 cb(err, null):

function foo(cb: (err: Error | null, result: MyType)) {
   try {
     const result = getResultSomehow();
     cb(null, result);
   } catch(err) {
     cb(err, null) // Argument of type 'null' is not assignable to parameter of type MyType
}

现在这很有意义,我可以通过更改函数的签名来解决它:function foo(cb: (err: Error | null, result: MyType | null)) 但我不希望这样,因为现在这个函数的调用者突然必须检查结果是否不为空。但我希望他们只检查 err,如果 err 为 null,则 result 必须有一个值(类似于 fs.readFile 等 NodeJS 函数)。

如何在 TypeScript 中表达这一点?

我确实检查了fs.readFile 的类型,它的类型与我的函数一样,结果参数dataBuffer,不是可选的,也不为空。但由于他们的实现是用纯 JS 实现的,我猜他们不会遇到我遇到的 TypeScript 错误(?)

【问题讨论】:

  • 请分享可重现的例子

标签: node.js typescript callback


【解决方案1】:

有趣的问题 - 问题是你不能强迫foo 的调用者不访问result 并阻止他/她认为result 是在错误的情况下定义的,除非你这样做@ 987654324@。也许他/她认为即使出现错误,foo 仍可能返回结果。

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

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

但是,您应该记录这一点,以便调用者知道在出现错误时result 将始终是null

【讨论】:

  • 模糊了!不过谢谢
猜你喜欢
  • 2012-10-19
  • 2020-08-26
  • 2019-03-29
  • 1970-01-01
  • 2020-09-20
  • 2021-11-26
  • 2020-07-29
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多