javascript - 如何从 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
解决方案
您正在调用回调,例如:return await callback(t, data);
通过使用await
callback
预计会返回一个Promise
(你只能等待承诺)
您需要为此调整签名:
callback: <T> (t: firestore.Transaction, data: any) => Promise<T>
通过使用async
on 函数,它会自动被包装在一个 Promise 中。
所以你应该这样称呼它:
await validateViaTransaction(id, null, async (t: firestore.Transaction) => {
t.set(new data here...., {merge: true});
return "Validation Successful";
})
使用异步,回调现在将返回一个Promise<string>
推荐阅读
- c# - 在 C# 中使用子字符串时 Fortify Null Deference 中的问题
- algorithm - 使用哪种机器学习算法和工具来建议使用哪些箱以及数量?
- javascript - 使用 firebase 和 js 注册和重定向到主页时出现问题
- python - 如何从 ReactJS 和 Python 通信数据?
- r - httr GET 挂起,但 download.file 有效
- python - 转置卷积层中可训练参数的数量
- javascript - 颁发未签名的可验证凭证时出现 IOTA 身份错误
- powershell - 如何在 Powershell 中查找和替换字符串
- javascript - (Angular 10) 使用 Jasmine 测试指令
- pandas - DataFrame 到 JSON - 然后在雪花中展平