Type 'IterableIterator' is not an array type or string type
03.01.2024
Чтобы решить ошибку "Type 'IterableIterator' is not an array or a string type", установите свойство target на es6 в вашем файле tsconfig.json или включите downlevelIteration для генерации более совместимого кода JavaScript для итераций.
Вот два примера, как возникает эта ошибка.
function* generator(a: number, b: number, c: number): IterableIterator<number> {
yield a;
yield b;
yield c;
}
// ⛔️ Error: Type 'IterableIterator<number>' is not an array type
// or a string type. Use compiler option '--downlevelIteration'
// to allow iterating of iterators.ts(2569)
for (const num of generator(5, 10, 15)) {
console.log(num); // 👉️ 5, 10, 15
}
// -------------------------------------------------------------------
const regexp = RegExp('he*', 'g');
const str = 'hello hey hi';
const matches = str.matchAll(regexp);
// ⛔️ Error: Type 'IterableIterator<RegExpMatchArray>' is not
// an array type or a string type. Use compiler option
// '--downlevelIteration' to allow iterating of iterators.ts(2569)
for (const match of matches) {
console.log(match);
}
Обновите ваш tsconfig.json
Для решения ошибки установите свойство target на es6 в вашем файле tsconfig.json.
{
"compilerOptions": {
"target": "es6",
// ... ваши другие параметры
}
}
Опция target изменяет, какие функции JavaScript будут транспилированы на более старые версии, а какие останутся неизменными.
Если это не устранило ошибку, попробуйте перезапустить вашу среду разработки. Например, VSCode иногда требует перезагрузки.
Если вы используете метод String.matchAll и ошибка всё ещё остаётся, добавьте ES2020.String в массив lib в вашем tsconfig.json.
{
"compilerOptions": {
"target": "es6",
"lib": [
"ES2020.String",
// ... ваши другие библиотеки
],
// ... ваши другие параметры
}
}
ES6 - хороший выбор, потому что современные браузеры поддерживают все функции ES6.
Если вам нужна поддержка старых окружений, вы можете использовать опцию downlevelIteration для решения этой ошибки.
{
"compilerOptions": {
"target": "es5",
"downlevelIteration": true,
// ... ваши другие параметры
},
}
Опция downlevelIteration транспилирует ваш код TypeScript в более старую версию JavaScript.
Это делает ваш код менее производительным и более громоздким, однако он сможет выполняться в более старых браузерах.
ES6 добавил несколько примитивов итерации, таких как цикл for...of, распространение массива [...myArr1, ...myArr2] и т. д.
Если вам нужно использовать эти примитивы итерации с установленной целью es5, вам нужно включить downlevelIteration в вашем файле tsconfig.json.
Обратите внимание, что генерируемый JavaScript будет очень громоздким и менее производительным, чем если бы вы оставили примитивы итерации без изменений, установив target на es6.
