it-swarm.com.ru

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'.
169
Stav Alfi

Angular 5 с TypeScript ^ 2.0.0

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

Чтобы заставить это работать с TypeScript 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 с TypeScript 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 из своего каталога для ввода текста, если он у вас есть. 

Например:

Это будет конфликтовать с 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 должно быть единственным местом, откуда он импортируется. 

Angular CLI 1.0.0-beta.30

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

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

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

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

 enter image description here

Tsconfig compilerOptions lib vs types

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

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

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

tl; dr 

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

172
Kris Hollenbeck

У меня также есть та же проблема - «Обещание не найдено» - когда код хочет создать объект Promise.

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

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

75
Daniel C. Deng

Angular 2 Final

- поддержка 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 support

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

63
Pankaj Parkar

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

TLDR;

  1. Перенести в es6

    • ошибка исчезает (с некоторыми ошибками).
  2. Перенести в 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

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

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

main.ts:

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

При наличии 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)
    }
}
8
Niels Steenbeek

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

проверьте, существует ли файл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

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

8
All Іѕ Vаиітy

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

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

6
Nandakumar Purohit

Поскольку 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" />
5
James

Мне удалось решить эту проблему, не добавляя ссылку на тройную косую черту в файл начальной загрузки TS, изменив ES6 (что вызывает кучу проблем, так же как @DatBoi said), обновили NodeJS и/или NPM VS2015 в комплекте строит или устанавливает 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 по умолчанию.

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

3
Darkseal

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

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

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

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

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

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

3
Simon Trewhella

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

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

Вы должны установить «Build Action» вашего tsconfig.json в «Content» (щелкните правой кнопкой мыши -> Properties), тогда VS подхватит его.

1
Jopnert

Еще одно хорошее решение . Вам нужно создать файл 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. Ваше веб-приложение после этого не поддерживает некоторые старые версии браузеров.

1
Alexey Nikitenko

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

1
CharithW

Я заметил, что эти проблемы появляются после обновления с 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": "./"
  }
}
1
dasch88

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

  1. npm clean cache
  2. npm install
  3. npm install -g typings
  4. Удалить каталог typings из проекта (установлены модули ввода в каталог)
  5. typings install
  6. npm run
1
Vicky Gonsalves

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

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

0
coffeenjava

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

0
dawesome