Созонов Алексей

Веб-разработчик

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.

#typescript