Как заставить TypeScript выбрать правильную сигнатуру метода?

Экспериментирую с методом parallelLimit() из библиотеки async, имеющему несколько сигнатур, которые зависят от того, передан ли третий аргумент, или нет, и в JS всё с ней замечательно:

const { parallelLimit } = async

new Promise(async () => {
  const tasks = Array(10)
    .fill(null)
    .map((item, i) => async () => i)
  const limit = 5
  await parallelLimit(tasks, limit)
    .then((results) => console.log(results.join(',')))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/async/3.2.3/async.js"></script>
Интерпретация на jsfiddle

Пытаюсь использовать её же в TypeScript:

npm i --save-dev @types/async

Но TypeScript не выбирает правильную сигнатуру, предполагая, что метод вернёт void:

Свойство "then" не существует в типе "void".ts(2339)

Как решить эту проблему?


Ответы (1 шт):

Автор решения: UserTest013

Конкретно в вашем случае надо указать передаваемые типы для parallelLimit.

import { parallelLimit } from 'async';

new Promise(async () => {
  const tasks = Array(10)
    .fill(null)
    .map((item, i) => async () => i)
  const limit = 5
  await parallelLimit<number, number[], Error>(tasks, limit)
    .then((results) => console.log({ results }))
})
→ Ссылка