类型:数组<promise <t>&gt;承诺<array <t>&gt;

时间:2016-05-03 22:13:52

标签: typescript

我编写了一个辅助方法并将其添加到Array.prototype中以在FileEventHandler中包装一组promise。

process_IN_CLOSE_WRITE

现在我正在努力让TypeScript打字工作,但是我没有办法将Array类型“解压缩”为Promise包装的值:

Promise.all

理想情况下,我希望Array.prototype.awaitPromises = function() { return Promise.all(this); } - &gt; declare global { interface Array<T> { awaitPromises<U>(): Promise<Array<U>> } } 并且无需指定Array<Promise<T>>。这是可能的,还是我坚持我所拥有的?

1 个答案:

答案 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;
}