У меня есть следующий фрагмент кода, который приводит к ошибке компиляции в TypeScript:
type Promisable = (() => Promise<string>) | (() => Promise<number>);
const func = async (promisable: Promisable) => {
await Promise.all([promisable()]);
};
Ошибка выглядит следующим образом
Никакая перегрузка не соответствует этому вызову. Последняя перегрузка дала следующую ошибку. Аргумент типа '(Promise | Promise) []' нельзя назначить параметру типа 'Iterable>'. Типы, возвращаемые функцией Symbol.iterator.next (...), несовместимы между этими типами.
Для записи удаление типа объединения работает так, как задумано:
type Promisable = () => Promise<string>;
const func = async (promisable: Promisable) => {
await Promise.all([promisable()]);
};
Вы можете увидеть ошибку для себя здесь https://www.typescriptlang.org/play/?ssl=4&ssc=3&pln=1&pc=1#code / C4TwDgpgBACgTgewLYEsDOBDARgG2gXigAoiBKKfAPlkVTQgB41g4UA7Ac0vIB9iyK1eMnSM2AVyRYIcbgG4AsACgAxgjbMoAM3FsVFKBjQg9xMLXTY8ALhojMuCOSpQA3sqiGA7hhTA7dBAAdBg4OEQA2ub2VhBkALqkikoAvnJAA
1017 * это не представляется возможным использовать типы профсоюзов в сочетании с
Promise.all
EDIT: Я знаю, что вместо этого можно использовать что-то вроде () => Promise<string|number>
. Но в сложном приложении с большим количеством асинхронных функций и больших типов непросто преобразовать объединение функций в функцию объединения. Это не очень практично с точки зрения кода.