Typescript выдает ошибку при вызове Promise.all с массивом обещаний - PullRequest
2 голосов
/ 14 июля 2020

У меня проблема с обещаниями в машинописном тексте. Я пытаюсь вызвать Promise.all с массивом обещаний , но вместо этого я получаю

Никакая перегрузка не соответствует этому вызову. Последняя перегрузка вызвала следующую ошибку. Аргумент типа '(Promise | Promise) []' не может быть назначен параметру типа 'Iterable '. [...]

Ниже упрощенный пример, который я имею в виду:

const promise1 = Promise.resolve(true);         //promise1:Promise<boolean>
const promise2 = Promise.resolve('promise...'); //promise2:Promise<string>
const promises = [promise1, promise2];

Promise.all(promises); //Error here

Однако приведенный ниже код работает так, как я предполагал.:

const promise1 = Promise.resolve(true);
const promise2 = Promise.resolve('promise...');

Promise.all([promise1, promise2]);

Мне кажется, ошибка , но я не уверен. Я просматривал GitHub, искал эту проблему, но не нашел совпадений. Или я что-то делаю не так и есть решение, позволяющее преодолеть проблему. Очевидно, я не могу просто написать Promise.all ([обещание1, обещание2]) в моем основном коде, потому что массив обещаний - это динамический c.

Я использую машинописный текст @3.9.6.

1 Ответ

3 голосов
/ 14 июля 2020

Проблема не имеет ничего общего с обещаниями как таковыми, а скорее с тем, как TypeScript определяет тип кортежа.

Подробнее о фактической проблеме вы можете прочитать в этом ответе, но суть в следующем:

const a = [1, "a", true] //<- (string | number | boolean)[], not [number, string, boolean]

Проблема должна быть исправлена ​​введением видов вариади c в TS 4.0 . На данный момент есть два способа сделать то, что вы хотите.

Первый - const assertions

const b = [1, "a", true] as const // <- [number, string, boolean]

И второй - использовать служебную функцию как тот, что был опубликован в ответе, который я привел выше.

В вашем конкретном случае c способ ввода Promise.all не очень хорошо сочетается с тем, как TS определяет тип promises. Это легко исправить, создав правильный кортеж одним из описанных выше методов.

Ссылка на игровую площадку

...