【发布时间】: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<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 函数更像是通用的?就像我返回 string 之后,它的类型也将是 string
【问题讨论】:
-
您正在使用
await而不是callback,其返回类型为T。有什么理由使用 await 吗?如果是这样,你的回调应该返回一个Promise<T>,你的回调应该是async (t: firestore.Transaction): Promise<string> -
@briosheje 是的,因为我通过了
t,而后者可能仍然使用t.get, -
那么结果签名应该是
Promise<T>。 -
是的,这是一个错字,会更新它。
-
问题是您只是不能在这种情况下将
string用作通用T,因为string是一个原语。您应该规范化该签名的输出,或者只提供Promise<any>作为响应类型。
标签: javascript typescript firebase types