首页 > 解决方案 > 如何从 Typescript 中的回调中获取返回值的类型

问题描述

我有一个这样的代码:

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<unknown>

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

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功能更像 generic-ish吗?就像我回来string之后,它的类型也将是string

标签: javascripttypescriptfirebasetypes

解决方案


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

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

您需要为此调整签名:

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

通过使用asyncon 函数,它会自动被包装在一个 Promise 中。

所以你应该这样称呼它:

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

 return "Validation Successful";
})

使用异步,回调现在将返回一个Promise<string>


推荐阅读