这里的问题是
BatchPromise
generic
类
BatchPromise<T>
哪里
T
表示中返回的键到值映射的对象类型
resolveAll()
class BatchPromise<T extends object = {}> {
...
async resolveAll(): Promise<T> { ... }
}
所以每次你打电话
add()
,您将从
承诺<T>
BatchPromise<T & Record<K, V>>
哪里
K
和
V
批量承诺
因此
添加()
缩小
类型,其中
是
assertion function
(以便
add
返回
asserts this is BatchPromise<T & Record<K, V>>
).但是断言函数现在不是很容易使用(请参见
microsoft/TypeScript#33622
而不是制造
bp.add()
bp
,如果
bp.add()
批量承诺
修改类型的对象:
add<K extends string, V>(
key: K, promise: Promise<V>, decorator?: resultDecorator
): BatchPromise<T & Record<K, V>> {
...
return this as BatchPromise<T & Record<K, V>>;
}
为了让它起作用,你需要改变你的呼叫方式
合并
method chaining
而不是多个语句:
const batchPromiseHandler = new BatchPromise()
.add('order', getOrderInfo())
.add('customer', getCustomerInfo());
batchPromiseHandler
会是一种
BatchPromise<{order: OrderInfo, customer: CustomerInfo}>
.
const result = await batchPromiseHandler.resolveAll();
result.customer; // CustomerInfo
result.order; // OrderInfo
result.randomThing; // error!
// Property 'randomThing' does not exist on type
// 'Record<"order", OrderInfo> & Record<"customer", CustomerInfo>'
看起来不错。您可以验证(通过下面的游乐场链接)IDE的IntelliSense是否能够提示该操作
result
customer
和
order
好吧,希望这能给你一个前进的方向。祝你好运
Playground link to code