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.
- https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/
- 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.