【问题标题】:How to get type of returned value from callback in Typescript如何从 Typescript 中的回调中获取返回值的类型
【发布时间】:2019-11-10 06:13:29
【问题描述】:

我的代码是这样的:

validateViaTransaction(
  id: string,
  datas: any,
  callback: <T> (t: firestore.Transaction, data: any) => Promise<T>
) => {
  return await firestore().
   runTransaction(async t => {
    get someting...

    validate something and throw err...

    return await callback(t, data);

   }).catch(err => { throw err; });
}

现在当我尝试稍后使用时:

await validateViaTransaction(id, null, (t: firestore.Transaction) => {
 t.set(new data here...., {merge: true});

 return "Validation Successful";
})

现在我检查代码的返回类型是 Promise&lt;unknown&gt;

当我在代码中实现它时,错误是这样的。

Argument of type '(t: Transaction) => string' is not assignable to parameter of type '<T>(t: Transaction, data: any) => T'.
  Type 'string' is not assignable to type 'T'.
    'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{}'.ts(2345)

有什么方法可以让我的callback 函数更像是通用的?就像我返回 string 之后,它的类型也将是 string

【问题讨论】:

  • 您正在使用await 而不是callback,其返回类型为T。有什么理由使用 await 吗?如果是这样,你的回调应该返回一个Promise&lt;T&gt;,你的回调应该是async (t: firestore.Transaction): Promise&lt;string&gt;
  • @briosheje 是的,因为我通过了t,而后者可能仍然使用t.get
  • 那么结果签名应该是Promise&lt;T&gt;
  • 是的,这是一个错字,会更新它。
  • 问题是您只是不能在这种情况下将string 用作通用T,因为string 是一个原语。您应该规范化该签名的输出,或者只提供 Promise&lt;any&gt; 作为响应类型。

标签: javascript typescript firebase types


【解决方案1】:

您正在调用回调,例如:return await callback(t, data);

通过使用await callback 预计会返回一个Promise(你只能等待承诺)

您需要为此调整签名:

callback: <T> (t: firestore.Transaction, data: any) => Promise<T>

通过在函数上使用async,它会自动被包装在一个promise中。

所以你应该这样称呼它:

await validateViaTransaction(id, null, async (t: firestore.Transaction) => {
 t.set(new data here...., {merge: true});

 return "Validation Successful";
})

使用异步,回调现在将返回 Promise&lt;string&gt;

【讨论】:

  • 试过了,但错误差不多,```Type 'Promise' 不能分配给 type 'Promise' ```
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多