Angular: не удается найти Promise, Map, Set и Iterator

После установки Angular компилятор Typescript продолжает получать сообщения об ошибках, связанных с отсутствием Promise, Map, Set и Iterator.

До сих пор я игнорировал их, но теперь мне нужен Promise чтобы мой код мог работать.

import {Component} from 'angular2/core';
@Component({
    selector: 'greeting-cmp',
    template: '<div>{{ asyncGreeting | async}}</div>'
})
export class GreetingCmp {
    asyncGreeting: Promise<string> = new Promise(resolve => {
// after 1 second, the promise will resolve
        window.setTimeout(() => resolve('hello'), 1000);
    });
}

Additional information:
npm -v is 2.14.12
node -v is v4.3.1
typescript v is 1.6

Ошибки:

................ERROS OF MY CODE.................
    C:\Users\armyTik\Desktop\angular2\greeting_cmp.ts
    Error:(7, 20) TS2304: Cannot find name 'Promise'.
    Error:(7, 42) TS2304: Cannot find name 'Promise'.
    .........................................
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\platform\browser.d.ts
    Error:(77, 90) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\application_ref.d.ts
    Error:(83, 60) TS2304: Cannot find name 'Promise'.
    Error:(83, 146) TS2304: Cannot find name 'Promise'.
    Error:(96, 51) TS2304: Cannot find name 'Promise'.
    Error:(96, 147) TS2304: Cannot find name 'Promise'.
    Error:(133, 90) TS2304: Cannot find name 'Promise'.
    Error:(171, 81) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\change_detection\parser\locals.d.ts
    Error:(3, 14) TS2304: Cannot find name 'Map'.
    Error:(4, 42) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\debug\debug_node.d.ts
    Error:(14, 13) TS2304: Cannot find name 'Map'.
    Error:(24, 17) TS2304: Cannot find name 'Map'.
    Error:(25, 17) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\di\provider.d.ts
    Error:(436, 103) TS2304: Cannot find name 'Map'.
    Error:(436, 135) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\linker\compiler.d.ts
    Error:(12, 50) TS2304: Cannot find name 'Promise'.
    Error:(16, 41) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\linker\dynamic_component_loader.d.ts
    Error:(108, 136) TS2304: Cannot find name 'Promise'.
    Error:(156, 150) TS2304: Cannot find name 'Promise'.
    Error:(197, 128) TS2304: Cannot find name 'Promise'.
    Error:(203, 127) TS2304: Cannot find name 'Promise'.
    Error:(204, 141) TS2304: Cannot find name 'Promise'.
    Error:(205, 119) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\render\api.d.ts
    Error:(13, 13) TS2304: Cannot find name 'Map'.
    Error:(14, 84) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\async.d.ts
    Error:(27, 33) TS2304: Cannot find name 'Promise'.
    Error:(28, 45) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\collection.d.ts
    Error:(1, 25) TS2304: Cannot find name 'MapConstructor'.
    Error:(2, 25) TS2304: Cannot find name 'SetConstructor'.
    Error:(4, 27) TS2304: Cannot find name 'Map'.
    Error:(4, 39) TS2304: Cannot find name 'Map'.
    Error:(7, 9) TS2304: Cannot find name 'Map'.
    Error:(8, 30) TS2304: Cannot find name 'Map'.
    Error:(11, 43) TS2304: Cannot find name 'Map'.
    Error:(12, 27) TS2304: Cannot find name 'Map'.
    Error:(14, 23) TS2304: Cannot find name 'Map'.
    Error:(15, 25) TS2304: Cannot find name 'Map'.
    Error:(95, 41) TS2304: Cannot find name 'Set'.
    Error:(96, 22) TS2304: Cannot find name 'Set'.
    Error:(97, 25) TS2304: Cannot find name 'Set'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\lang.d.ts
    Error:(13, 17) TS2304: Cannot find name 'Map'.
    Error:(14, 17) TS2304: Cannot find name 'Set'.
    Error:(78, 59) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\promise.d.ts
    Error:(2, 14) TS2304: Cannot find name 'Promise'.
    Error:(7, 32) TS2304: Cannot find name 'Promise'.
    Error:(8, 38) TS2304: Cannot find name 'Promise'.
    Error:(9, 35) TS2304: Cannot find name 'Promise'.
    Error:(9, 93) TS2304: Cannot find name 'Promise'.
    Error:(10, 34) TS2304: Cannot find name 'Promise'.
    Error:(11, 32) TS2304: Cannot find name 'Promise'.
    Error:(11, 149) TS2304: Cannot find name 'Promise'.
    Error:(12, 43) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\http\headers.d.ts
    Error:(43, 59) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\http\url_search_params.d.ts
    Error:(11, 16) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\platform\browser\browser_adapter.d.ts
    Error:(75, 33) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\platform\dom\dom_adapter.d.ts
    Error:(85, 42) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\CoreOperators.d.ts
    Error:(35, 67) TS2304: Cannot find name 'Promise'.
    Error:(50, 66) TS2304: Cannot find name 'Promise'.
    Error:(89, 67) TS2304: Cannot find name 'Promise'.
    Error:(94, 38) TS2304: Cannot find name 'Promise'.
    Error:(94, 50) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\Observable.d.ts
    Error:(46, 62) TS2304: Cannot find name 'Promise'.
    Error:(47, 42) TS2304: Cannot find name 'Iterator'.
    Error:(103, 74) TS2304: Cannot find name 'Promise'.
    Error:(103, 84) TS2304: Cannot find name 'Promise'.
    Error:(143, 66) TS2304: Cannot find name 'Promise'.
    Error:(158, 65) TS2304: Cannot find name 'Promise'.
    Error:(201, 66) TS2304: Cannot find name 'Promise'.
    Error:(206, 38) TS2304: Cannot find name 'Promise'.
    Error:(206, 50) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\ForkJoinObservable.d.ts
    Error:(6, 50) TS2304: Cannot find name 'Promise'.
    Error:(7, 58) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\FromObservable.d.ts
    Error:(7, 38) TS2304: Cannot find name 'Promise'.
    Error:(7, 51) TS2304: Cannot find name 'Iterator'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\PromiseObservable.d.ts
    Error:(9, 31) TS2304: Cannot find name 'Promise'.
    Error:(10, 26) TS2304: Cannot find name 'Promise'.

Ответ 1

Угловой 5 с Typescript ^ 2.0.0

Это должно также работать с более ранними версиями Angular 2+.

Чтобы заставить это работать с машинописным шрифтом 2.0.0, я сделал следующее.

npm install --save-dev @types/core-js

tsconfig.json

 "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "noEmitOnError": true,
    "noImplicitAny": false,
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "../node_modules/@types"
    ],
    "types": [
      "core-js"
    ]
  }

Подробнее о @types с машинописью 2.0.0.

  1. https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/
  2. https://www.npmjs.com/~types

Пример установки:

npm install --save-dev @types/core-js

Дубликат ошибки идентификатора

Скорее всего, это связано с тем, что повторяющиеся печатные символы ecmascript 6 уже импортированы откуда-то еще, скорее всего, из старой es6-shim.

Дважды проверьте typings.d.ts чтобы убедиться, что нет ссылок на es6. Удалите все ссылки на es6 из вашего каталога для es6 текста, если он у вас есть.

Например:

Это будет конфликтовать с types:['core-js'] в typings.json.

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332" 
    // es6-shim will also conflict
  }
}

Включение core-js в массив типов в tsconfig.json должно быть единственным местом, из которого он импортируется.

Угловой CLI 1.0.0-бета .30

Если вы используете Angular-CLI, удалите массив lib в typings.json. Это, кажется, противоречит объявлению core-js в типах.

"compilerOptions" : {
  ...
  // removed "lib": ["es6", dom"],
  ...
},
"types" : ["core-js"]

Webstorm/Intellij Пользователи, использующие Angular CLI

Убедитесь, что встроенный компилятор машинописи отключен. Это будет конфликтовать с CLI. Для компиляции вашего машинописного текста с помощью CLI вы можете настроить конфигурацию ng serve.

enter image description here

Tsconfig compilerOptions lib против типов

Если вы предпочитаете не устанавливать базовые определения типов js, есть несколько библиотек es6, которые включены в набор машин. Они используются через свойство lib: [] в tsconfig.

Смотрите здесь, например: https://www.typescriptlang.org/docs/handbook/compiler-options.html

Примечание. Если --lib не указано, будет добавлена библиотека по умолчанию. Используемая по умолчанию библиотека: ► Для --target ES5: DOM, ES5, ScriptHost ► Для --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

ТЛ; др

Краткий ответ: "lib": [ "es6", "dom" ] или "types": ["core-js"] могут быть использованы для разрешения can't find Promise,Map, Set and Iterator. Однако использование обоих приведет к ошибкам дубликатов идентификаторов.

Ответ 2

У меня тоже такая же проблема - "Promise not found" - когда код хочет создать объект Promise.

Попробовал некоторое решение, найденное в stackoverflow, включая тот, который вытащил System.config({...}), чтобы сформировать system.js и включил его в index.html.

Наконец, я решил проблему. Проблема в том, что в index.html включен es6-shim.min.js. Однако в tsconfig.json свойство "target" в разделе "compilerOptions" имеет значение "es5". После того как я изменил его на "es6", ошибка исчезла.

Ответ 3

Angular 2 Финал

- поддержка es5 (отлично работает с TS 2.0.0 +)

За обновление es6-shim теперь не поддерживается, если у вас есть оба набора символов вместе es6-shim и core-js вместе. Удалите текст es6-shim, указав в tsconfig.json. Теперь вы можете ссылаться ниже core-js наберите es5 поддержку внутри main.ts

///<reference path="./../typings/globals/core-js/index.d.ts"/>

tsconfig.json

exclude: [
   "node_modules", //<-- this would be needed in case of VS2015
   "node_modules/@typings",
   "typings"
]

- es6 suppport

Вам просто нужно установить свойство "target" в значение es6, тогда все будет удалено. И преобразованный код будет в формате es6.

Ответ 4

Обновлено с angular -2.0.0-rc.4

TL;DR;

  • Переместить на es6

    • ошибка исчезает (с некоторыми ошибками).
  • Переместить на es5

    • установить типизацию
    • установите шайбу es6
    • убедитесь, что он компилируется с вашим кодом.
    • ошибка исчезает.

Для читателей:

Вариант 1: пересылка на es6 или es2015

tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "system",
    "moduleResolution": "node",
     ...
  },
"exclude": [
    "node_modules",
    "jspm_packages"
  ]
}

Имейте в виду uglifyjs не поддерживает es6 на данный момент. Это может повлиять на создание производственных пакетов.

Вариант 2: Переместите на es5, установите типизацию, а затем установите es6-shim:

tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
     ...
  },
  "exclude": [
    "node_modules",
    "jspm_packages"
  ]
}

Установите тиски, затем установите es6-shim:

npm install typings --saveDev
typings install dt~es6-shim --global --save

Если вы идете по этому маршруту, вам нужно убедиться, что компилятор typescript может найти файл .d.ts.

У вас есть два варианта:

а. Убедитесь, что ваш tsconfig.json находится на том же уровне, что и папка с образцами.

б. Включите ссылку в файл main.ts, где загружено приложение angular2.

Вариант A: убедитесь, что ваш tsconfig.json находится на том же уровне, что и папка с типизиями.

Примечание. НЕ используйте флаг исключения, чтобы исключить папку типизации.

project
|-- src
|-- node_modules
|-- package.json
|-- typings
|-- tsconfig.json

Вариант B: Ссылка в основном файле перед загрузкой (не делайте этого):

Как показано в других ответах, этот файл больше не включается Angular

main.ts:

/// <reference path="../../typings/globals/es6-shim/index.d.ts" />

Ответ 5

Это то, что сработало для меня.

проверьте, существует ли файл typings.json,

Это выглядит примерно так:

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160317120654",
    "jasmine": "registry:dt/jasmine#2.2.0+20160505161446",
    "node": "registry:dt/node#6.0.0+20160613154055"
  }
}

Установите пакет типизации по всему миру.

sudo npm install -g typings

после установки типирования, запустите

typings install

затем перезагрузите сервер.

Ответ 6

При использовании Typescript >= 2 опция "lib" в tsconfig.json выполнит задание. Нет необходимости в Типиках. https://www.typescriptlang.org/docs/handbook/compiler-options.html

{
    "compilerOptions": {
        "target": "es5",
        "lib": ["es2016", "dom"] //or es6 instead of es2016(es7)
    }
}

Ответ 7

У меня была аналогичная проблема, когда он не распознавал метод Promise.resolve(). Я изменил значение "target" с ES5 на ES6 в tsconfig.json. Это решило проблему.

Надеюсь, что это поможет.

Ответ 8

Так как Angular 2 отправился в RC 0,/angular2/typings/browser.d.ts больше не является частью дистрибутива Angular 2. Файл может быть установлен отдельно.

Отсюда: https://github.com/angular/angular/issues/8513 есть несколько вариантов. Тот, который работал у меня, был:

typings install es6-shim --ambient --save

// In your app.ts
/// <reference path="typings/browser.d.ts" />

Ответ 9

При использовании Angular2 RC1 с типом v1.0 + используйте команду:

typings install dt~core-js --save --global

чтобы установить определение core-js, а затем ссылаться на свой глобальный индекс в файле main.ts:

/// <reference path="../../../typings/index.d.ts" />

Если вы используете es6-shim или какую-либо другую библиотеку прокладки, установите вместо этого тиски

Обратитесь к https://github.com/typings/typings/issues/517

Ответ 10

Мне удалось решить эту проблему, не добавляя ссылку на тройную косую черту в файл начальной загрузки TS, изменив ES6 (что вызывает кучу проблем, как сказал @DatBoi), обновите VS2015 NodeJS и/или связанные с NPM сборки или установили typings во всем мире.

Вот что я сделал за несколько шагов:

  • добавлены typings в файл проекта package.json.
  • добавлен блок script в файл package.json для выполнения/обновления typings после каждого действия NPM.
  • добавил файл typings.json в корневую папку проекта со ссылкой на core-js, который на данный момент является одним из лучших пакетов shim/polyfill для решения проблем ES5/ES6.

Вот как должен выглядеть файл package.json (только соответствующие строки):

{
  "version": "1.0.0",
  "name": "YourProject",
  "private": true,
  "dependencies": {
    ...
    "typings": "^1.3.2",
    ...
  },
  "devDependencies": {
    ...
  },
  "scripts": {
      "postinstall": "typings install"
  }
}

И вот файл typings.json:

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160621231320"
  }
}

(Jasmine и Node не требуются, но я предлагаю сохранить их на случай, если это потребуется в будущем).

Это исправление отлично работает с Angular2 RC1 до RC4, что мне и было нужно, но я думаю, что оно также исправит аналогичные проблемы с другими пакетами библиотек с поддержкой ES6.

AFAIK, я думаю, что это самый чистый способ исправить это, не испортив настройки VS2015 по умолчанию.

Для получения дополнительной информации и подробного анализа проблемы, я также предлагаю прочитать этот пост в моем блоге.

Ответ 11

Я заметил, что эти проблемы появляются после обновления с Angular 5 до Angular 6. Я смог это исправить, выполнив в VS2017 следующее:

  • Убедитесь, что TypeScript SDK был установлен (через установщик Visual Studio) для моей конкретной версии TypeScript, 2.9
  • Убедитесь, что свойство проекта Module System установлено таким же, как в моем файле tsconfig.json: ES2015. Это часто автоматически синхронизируется, если файл tsconfig находится в корне проекта. Тем не менее, поскольку я использовал шаблон VS Angular, он помещает эти файлы в подпапку "ClientApp", и свойство проекта Module System не было задано.

VS2017 Project Properties

tsconfig.json:

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "lib": [
      "es2017",
      "dom"
    ],
    "module": "es2015",
    "baseUrl": "./"
  }
}

Ответ 12

У меня была такая же проблема при создании объекта обещания внутри моего класса. Меняя целевое имя на "es5" с "es6", я решил проблему.

Ответ 13

Другое Возможное решение - переустановить типизацию:
Это работает для меня для "angular2": "2.0.0-beta.15"

  • npm clean cache
  • npm install
  • npm install -g typings
  • Удалить каталог typings из проекта (каталог, где установлены типовые модули)
  • typings install
  • npm run

Ответ 14

Другое хорошее решение. Вам нужно создать файл typings.json в корневой директории проекта с контентом:

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160725163759",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160909174046"
  }
}

Затем установите глобальный или локальный пакет типизации, если он не установлен (я устанавливаю его глобально):

sudo npm install --global typings

В команде запуска корневого каталога проекта:

typings install

После этого проблема решена. Не нужно изменять целевой параметр tsconfig на es6 или es7. После этого веб-приложение не поддерживает некоторые старые версии браузеров.

Ответ 15

Если вы пришли сюда, потому что видите эти ошибки в Visual Studio 2017, то у вас возникнет другая проблема, как и выше, если вам удастся скомпилировать. Это потому, что языковой сервис не выбирает ваш tsconfig.json.

https://developercommunity.visualstudio.com/content/problem/208941/vs-156-ignores-tsconfigjson-and-typescriptcompileb.html

Вы должны установить действие сборки вашего tsconfig.json в "Содержимое" (щелкните правой кнопкой мыши → Свойства), тогда VS подхватит его.

Ответ 16

Я нашел ссылку в boot.ts не правильным путем. Обновление этого пути до /// <reference path=">../../../node_modules/angular2/typings/browser.d.ts" /> разрешило ошибки Promise.

Ответ 17

Я тренируюсь с учебником angular2 (герой).
После установки @types/core-js, прокомментированного в ответах на эти вопросы, я получил ошибку" Duplicate identifier".
В моем случае это было решено как удаление строки lib в tsconfig.json.

// "lib": [ "es2015", "dom" ]

Ответ 18

моя файловая структура выглядит следующим образом:

project
 |--node-modules
 |   |--angular2
 |   |   |--typings
 |   |   |   |--browser.d.ts
 |--src
 |--app.ts

вставьте ниже в верхнюю часть приложения app.ts и ваша проблема решена.

/// <reference path=">../../../node_modules/angular2/typings/browser.d.ts" />

Ответ 19

У меня такая же проблема, и я могу найти ее в github https://github.com/angular/angular-cli/issues/1901, в котором говорится, что это проблема с typescrip[email protected].

Понижение typescript на 2.0.0 как глобально, так и локально помогло мне решить проблему.

Глобально:

npm uninstall typescript -g
npm cache clean
npm install [email protected] -g

Локально: перейдите в папку проекта, созданную с помощью ng new

npm uninstall typescript
npm cache clean
npm install [email protected]

Я также изменил версию typescript внутри package.json от ^2.0.0 до 2.0.0, но это не сработало, пока я не понижу установку локального typescript.