Уничтожение массива, возвращаемого асинхронной функцией, показывает ошибку машинописного текста - PullRequest
1 голос
/ 23 января 2020

Рассмотрим следующий пример. Код TypeScript

const p = new Promise((resolve, reject) => {resolve([47, undefined])})
const asy = async () => {const [a, b] = await p; console.log(a, b)}
asy()

Когда я запускаю его в node без проверки типов, он работает нормально и печатает 47 undefined. Однако проверка типов в VS Code подчеркивает [a, b] следующей ошибкой: Type 'unknown' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488).

Как я могу исправить эту ошибку и почему это происходит? Я думал, что любой действительный код JavaScript должен быть допустимым кодом TypeScript.

edit: Добавление as any после ожидания - это a решение.

1 Ответ

0 голосов
/ 23 января 2020

Обещание отображается как Promise<unknown>, поскольку Typescript не выводит типы разрешения Promise. И вы не можете разрушить unknown, потому что он не может быть разрушаем.

Вы можете явно ввести его:

const p = new Promise<[number, undefined]>((resolve, reject) => { resolve([47, undefined]) })
const asy = async () => { const [a, b] = await p; console.log(a) }
asy();
...