我编写了一个辅助方法并将其添加到Array.prototype中以在FileEventHandler
中包装一组promise。
process_IN_CLOSE_WRITE
现在我正在努力让TypeScript打字工作,但是我没有办法将Array类型“解压缩”为Promise包装的值:
Promise.all
理想情况下,我希望Array.prototype.awaitPromises = function() {
return Promise.all(this);
}
- > declare global {
interface Array<T> {
awaitPromises<U>(): Promise<Array<U>>
}
}
并且无需指定Array<Promise<T>>
。这是可能的,还是我坚持我所拥有的?
答案 0 :(得分:0)
我的坏,你可以这样做:
interface PromiseArray<T> extends Array<T | Promise<T>> {
awaitPromises(): Promise<Array<T>>;
}
但是我仍然认为设计一个扩展Array
的类并且只有awaitPromises
方法的类是更好的设计,毕竟那是面向对象的所有关于。
这就是我在原来的答案中所想到的:
问题在于你并不总是在数组中只有promises,你可以将值放在那里,而不仅仅是promises。
更重要的是,通过将此方法添加到Array
,您基本上可以说“所有数组可能包含promises”或“所有数组都可以用作Promise.all
的参数”。
子类化Array
有什么问题?
class PromiseArray<T> extends Array<T | Promise<T>> {
awaitPromises(): Promise<Array<T>> {
return Promise.all(this);
}
}
这里的关键(我认为)是Array<T | Promise<T>>
部分,如果您只是全局扩展默认Array<T>
界面,则无法真正做到这一点。
并且,您明确区分哪些阵列可以等待承诺,我认为这是一个更好的设计。
您还可以向Array
原型添加一项功能,以this
作为PromiseArray
返回{/ 1}}:
interface Array<T> {
toPromiseArray(): PromiseArray<T>;
}
Array.prototype.toPromiseArray = function() {
let arr = new PromiseArray<any>();
this.forEach(item => arr.push(item));
return arr;
}