Error TS2304: Build: не удалось найти имя "Iterable" после обновления до Angular 4

Я использую Typescript 2.4.1 и обновил многие пакеты в своем проекте. Среди них я обновил Angular от 2 до 4.3.1. После многих исправлений в пакетах @types у меня остались следующие ошибки:

\node_modules\@types\jquery\index.d.ts(2955,63): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(767,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(771,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(775,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(779,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(783,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(787,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(791,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(795,24): error TS2304: Build:Cannot find name 'Iterable'.
\node_modules\@types\three\three-core.d.ts(799,24): error TS2304: Build:Cannot find name 'Iterable'.

Я нашел много похожих вопросов и ответов, и преобладающее решение - нацелить "es2015" и/или добавить lib: [ "dom", "es2015", "es2015.iterable" ]. Я пробовал все это и многое другое, но я все еще остаюсь с той же ошибкой "Итерируемая".

Мой обновленный tsconfig.json:

{
    "compileOnSave": true,
    "compilerOptions": {
        "declaration": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "lib": [ "dom", "dom.iterable", "es2015", "es2015.iterable", "esnext" ],
        "module": "commonjs",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "noEmitOnError": true,
        "outDir": "./wwwroot/js",
        "removeComments": false,
        "rootDir": "./Client",
        "sourceMap": true,
        "suppressImplicitAnyIndexErrors": true,
        "target": "es2015",
        "typeRoots": [
            "./node_modules/@types",
            "./Client"
        ]
    },
    "exclude": [
        "node_modules",
        "wwwroot/lib"
    ],
    "filesGlob": [
        "./Client/**/*.ts"
    ]
}

Мой пакет .json:

{
    "version": "1.0.0",
    "name": "web-server",
    "private": true,
    "dependencies": {
        "@angular/common": "^4.3.1",
        "@angular/compiler": "^4.3.1",
        "@angular/core": "^4.3.1",
        "@angular/forms": "^4.3.1",
        "@angular/http": "^4.3.1",
        "@angular/platform-browser": "^4.3.1",
        "@angular/platform-browser-dynamic": "^4.3.1",
        "@angular/router": "^4.3.1",
        "@angular/upgrade": "^4.3.1",
        "bootstrap": "3.3.7",
        "core-js": "2.4.1",
        "lodash": "4.17.4",
        "pixi.js": "4.5.4",
        "reflect-metadata": "0.1.10",
        "rxjs": "^5.4.2",
        "systemjs": "0.20.17",
        "three": "0.86.0",
        "zone.js": "0.8.14"
    },
    "devDependencies": {
        "@types/chai": "^4.0.1",
        "@types/jquery": "3.2.9",
        "@types/lodash": "4.14.71",
        "@types/mocha": "2.2.41",
        "@types/pixi.js": "4.5.2",
        "@types/three": "0.84.19",
        "bower": "^1.8.0",
        "gulp": "3.9.1",
        "gulp-clean": "^0.3.2",
        "gulp-concat": "^2.6.1",
        "gulp-typescript": "^3.2.1",
        "gulp-inline-ng2-template": "^4.0.0",
        "gulp-sourcemaps": "^2.6.0",
        "gulp-tsc": "^1.3.2",
        "gulp-uglify": "^3.0.0",
        "merge2": "^1.1.0",
        "path": "^0.12.7",
        "rimraf": "^2.6.1",
        "systemjs-builder": "^0.16.9",
        "typescript": "2.4.1"
    },
    "scripts": {
        "gulp": "gulp",
        "rimraf": "rimraf",
        "bundle": "gulp bundle",
        "postbundle": "rimraf dist"
    }
}

Как может быть, что "итерируемый" не найден после всех этих включений lib? Компилятор Typescript не игнорирует мой tsconfig.json, так как изменение некоторой опции дает различные выходы, но без ошибок.

Моя среда - обновление Visual Studio 2015 3 с помощью Typescript Инструменты 2.4.1. Я использую npn @types (нет типизаций). Подробный вывод компиляции показывает, что Visual Studio эффективно использует версию 2.4.1.

И самое причудливое, что компиляция с использованием gulp не дает ошибок при использовании той же версии Typescript и tsconfig.

Ответ 1

Модернизация всей моей среды, а не проекта, сделала трюк. Я обновился до VS2017, и теперь все прекрасно компилируется.

Вероятно, в моей установке была коррупция, хотя я переустановил почти все, кроме VS2015.

Спасибо всем за помощь.

Ответ 2

"Итерируемый" определяется в файле типизации для node. Установка файла, который решил проблему для меня (node_modules/@types/node/index.d.ts).

npm install @types/ node --save-dev

Ответ 3

Это очень похоже на то, что описано здесь:

https://github.com/DefinitelyTyped/DefinitelyTyped/issues/16939

Итак, попробуйте использовать

"target": "es6"

как описано здесь, или что работает для нас:

"target": "es5",
"lib": ["es2016","dom"]

Ответ 4

Обновление: Решение ниже вызывало проблемы с развертыванием для меня. Лучшим решением было исключить только все tsconfig.json файлы в папке node_modules из решения. Кажется, связано с this Проблема с Visual Studio.

У меня была аналогичная проблема с теми же версиями Visual Studio и TypeScript. В Visual Studio Code все работает как ожидалось. Я попробовал другие опубликованные предложения безрезультатно... единственное, что исправлено, это исключить папку node_modules из моего проекта, но оставить ее в решении.

Ответ 5

Пришел к этому вопросу недавно, когда я искал свою проблему, и ни одна из них не решила мою проблему. Мне пришлось кое-что сделать, но, наконец, выяснилось, что я должен был включить файл определения es6 в начало моего корневого файла typescript:

///<reference path="./node_modules/typescript/lib/lib.es6.d.ts"/>