При нацеливании на ES5 с использованием оператора распространения ... для преобразования Iterator в Array отображается ошибка использования параметра компилятора -downlevelIteration. Когда он включен, операторы распространения кажутся просто безупречными.

Интересно, зачем это указывать? Есть ли какие-либо недостатки / ограничения, когда он включен, кроме добавления большего количества генерируемого сгенерированного кода из tslib?

Другой пример: Динамически создать массив из N (например, 3):

[...Array(3).keys()]  // output: [0, 1, 2]

Он отображает ошибку в VS Code:
введите здесь описание изображения

Сообщение об ошибке от tsc:

Тип «IterableIterator» не является типом массива или строковым типом. Используйте параметр компилятора --downlevelIteration, чтобы разрешить итерацию итераторов.

Отредактируйте и просмотрите код и ошибку в TypeScript Playground

79
Cerlancism 23 Ноя 2018 в 08:54

1 ответ

Лучший ответ

После прочтения примечаний к выпуску и статья Итерация нижнего уровня для ES3 / ES5 в TypeScript , я считаю, что ответ на этот вопрос заключается в том, что downlevelIteration отключен, потому что вам нужно решить (через конфигурацию), как вы хотите, чтобы TypeScript обрабатывал компиляцию кода совместимости (для поддержки более старых версий Javascript).

Как ясно из более подробного объяснения в статье, вы должны решить, хотите ли вы, чтобы TypeScript встраивал необходимые вспомогательные функции (простой, но может привести к увеличению размера производственного пакета), или если вы хотите настроить TypeScript для использования < a href = "https://www.npmjs.com/package/tslib" rel = "noreferrer"> tslib в качестве зависимости, а затем выполнить вызовы его внешних методов.

Я настоятельно рекомендую прочитать Итерацию нижнего уровня для ES3 / ES5 в TypeScript для более глубокого понимания… и, возможно, альтернативного решения вашей первоначальной проблемы.

58
remram 14 Сен 2020 в 15:24