角度:找不到Promise,Map,Set和Iterator


177

安装角之后,打字稿编译器的愈来愈约没有找到一些错误PromiseMapSetIterator

直到现在我都忽略了它们,但是现在我需要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
为Visual Studio 2015安装最新版本的TypeScript
mylesk

Answers:


177

带有打字稿^ 2.0.0的Angular 5

这也应与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"
    ]
  }

有关带有打字稿2.0.0的@types的更多信息。

  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以确保没有对的引用es6es6如果有引用,请从您的打字目录中删除所有引用。

例如:

这将与types:['core-js']types.json冲突。

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

包括core-js在types数组中tsconfig.json应该是导入它的唯一位置。

Angular CLI 1.0.0-beta.30

如果您使用的是Angular-CLI,请删除中的lib数组typings.json。这似乎与在类型中声明core-js冲突。

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

使用Angular CLI的Webstorm / Intellij用户

确保内置的打字稿编译器已禁用。这将与CLI冲突。要使用CLI编译打字稿,您可以设置ng serve配置。

在此处输入图片说明

TSConfig编译器选项lib vs类型

如果您不想安装核心js类型定义,则可以在typescript中附带一些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

tl; dr

简短答案"lib": [ "es6", "dom" ]或者"types": ["core-js"]可以用来解决can't find Promise,Map, Set and Iterator。但是,同时使用这两者将导致重复的标识符错误。


1
感谢您的更新和好的回答。我接受了您的回答,因为直到现在仍然有人来此错误。您是否有可能更新对RC 5的答案?我遇到了这个错误,按照您的回答,我可以使用Promise,但是现在node_modules \ @types \ es6-shim \ index.d.ts文件中存在很多错误:“重复标识符'PropertyKey'。” 行:6,10,248,283,290等; ..也出现以下错误:C:\ Users \ armyTik \ Desktop \ rc5 \ store-app-02 \ node_modules \ typescript \ lib \ lib.es2015.core.d.ts:17 :13重复的标识符“ PropertyKey”。
斯塔夫·阿尔菲,2016年

我更新了答案。希望这可以使事情有所清除。我相信RC5和RC4都应该相同。
克里斯·霍伦贝克

我还对其进行了更改,以仅反映core-js,因此希望它不会造成混淆。core-js和es6都用于es6特定的类型声明。我更喜欢core-js,因为它似乎比es6-shim涵盖了更多内容。
克里斯·霍伦贝克

感谢更新。这次我没有运气。我更新了当前的错误。
斯塔夫·阿尔菲,2016年

2
lib可能是更好的解决方案。github.com/angular/angular/blob/...
亚历

75

当代码要创建Promise对象时,我也遇到同样的问题-“找不到Promise”。

尝试了一些关于stackoverflow的解决方案,包括将System.config({...})取出以形成system.js并将其包含在index.html中的解决方案。

最后我解决了这个问题。问题在于,在index.html中包含es6-shim.min.js。但是,在tsconfig.json中,“ compilerOptions”下的“ target”属性的值为“ es5”。将其更改为“ es6”后,错误消失了。


2
这也是我的问题。有谁知道为什么这会导致该错误?
尼克·布雷迪

还修复了我在IntelliJ IDEA / WebStorm中收到的错误
-bentolor

5
但由于并非所有浏览器都已为es6准备就绪,因此必须将js代码移植到es5。是否有人在不同的浏览器中出现es6问题。谢谢!
bmnepali

对我适用于angular2.1.0。编译器2.1.0核心2.1.0 common2.1.0 rxjs5.0.0-beta.12平台-browser2.1.0
farhad goodarzi

谢谢!您为我节省了很多时间
CristianTraìna16年

63

Angular 2决赛

-es5支持(与TS 2.0.0 +完美兼容)

每次更新es6-shim现在不支持,如果安装在一起的两条分型es6-shimcore-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支持

您只需要将"target"属性设置为es6,那么所有错误都会消失。转译的代码将采用es6格式。


非常感谢你。我没有机会自己找到它。
Stav Alfi

@StavAlfi np ..发生了..很高兴能帮助您..谢谢:)
Pankaj Parkar '16

如果您使用快速入门教程中的项目设置,则应使用beta.7进行安装。您使用哪个Angular beta?我确认角度为2.0.0 beta.7的突破性变化
Marc

1
快速入门教程中的package.json支持angular 2的实际版本。如果您复制package.json。将tscconfig.json并在您的项目根目录下键入tings.json并调用npm -install项目设置就可以了。
Marc

3
@PankajParkar 2.0.0-rc.1。我只是在几天前通过入门文档[here]()才开始使用Angular。在package.json他们把"angular2-in-memory-web-api": "0.0.7"和角的东西其余来自"@angular/<module>": "2.0.0-rc.1"地方<module>commoncompilercorehttpplatform-browserplatform-browser-dynamicrouterrouter-deprecatedupgrade
赫克托

42

从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

如果采用这种方式,则需要确保打字稿编译器可以找到.d.ts文件。

您有两种选择:

一种。确保您的tsconfig.json与Types文件夹处于同一级别。

b。在main.ts文件中包含一个引用,用于引导您的angular2应用程序。

选项A:确保您的tsconfig.json与打字文件夹位于同一级别。

注意:请勿使用exclude标志来排除类型文件夹。

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

选项B:引导程序之前在主文件中进行引用(请勿这样做):

如其他答案所示,Angular不再包含此文件

main.ts:

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

2
选项1非常适合RC4。确保删除提供Promise,Map等内容的core-js和其他类型,以避免命名空间冲突。
wtfzn

1
谢谢,其中1人工作。需要core-js或es6-shim(不是两者)。然后在ts编译过程中包含./typings/index.d.ts。
k3a

1
--saveDev目前不起作用。--save-dev做。
乔治·索维托夫

1
typings应该在全球范围内安装吗?
乔治·索维托夫


8

这对我有用。

检查是否存在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

然后重新启动服务器。



5

由于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" />

1
谢谢你,但是输入1.0+的命令是:输入install dt〜es6-shim --save --global(github.com/typings/typings/issues/517),然后使用/// <reference path =“打字/es6-shim/es6-shim.d.ts“ />
Simon Trewhella

4

我设法解决了这个问题,而不必在TS引导程序文件中添加任何三斜杠引用,更改为ES6(这会带来很多问题,正如@DatBoi所说)来更新VS2015NodeJS和/或NPM捆绑的版本或typings在全球范围内安装。

这是我在几个步骤中所做的工作:

  • 添加typings在项目package.json文件中。
  • 在每个NPM操作之后script,在package.json文件中添加了一个块以执行/更新typings
  • typings.json在项目的根文件夹中添加了一个文件core-js,其中包含对的引用,这是目前解决ES5 / ES6问题的最好的shim / polyfill软件包之一。

下面是如何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

如果将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


2

我注意到从Angular 5升级到Angular 6后出现了这些问题。我能够通过在VS2017中执行以下操作来解决此问题:

  • 确保为我的特定版本2.9的TypeScript安装了TypeScript SDK(通过Visual Studio安装程序)
  • 确保将“模块系统”项目属性设置为与我的tsconfig.json中的属性匹配:ES2015。如果tsconfig文件位于项目的根目录中,则通常会自动同步。但是,由于我使用的是VS Angular模板,因此将这些文件放在“ ClientApp”子文件夹中,并且未设置“模块系统”项目属性。

VS2017项目属性

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

在类中创建一个Promise对象时,我遇到了同样的问题。通过将目标名称从“ es6”更改为“ es5”,解决了我的问题。


1

另一种可能的解决办法是重新安装分型:
这工作对我来说"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

另一个好的解决方案。您需要在项目的根目录中创建一个具有内容的文件Types.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。您的Web应用程序不支持该旧版本的浏览器。



0

我发现boot.ts中的引用不是正确的路径。更新该路径以/// <reference path=">../../../node_modules/angular2/typings/browser.d.ts" />解决Promise错误。


0

我正在使用angular2教程(英雄)进行培训。
在这些答案中安装@ types / core-js后,我收到了“重复标识符”错误。
就我而言,它可以通过删除tsconfig.json中的lib行来解决。

//“ lib”:[“ es2015”,“ dom”]


-1

我的文件结构如下:

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

将以下内容粘贴到您的app.ts顶部,问题就解决了

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

更改tsconfig.json中的TARGET条目以使其指向ES6,正如上面的某些答复中所指出的那样,为我解决了此问题。
TheCopyPaster

-1

我遇到了同样的问题,并能够在github https://github.com/angular/angular-cli/issues/1901中找到它,该状态指出这是一个问题typescript@2.0.2

将打字稿降级到2.0.0全球和本地都可以帮助我解决它。

全球范围内:

npm uninstall typescript -g
npm cache clean
npm install typescript@2.0.0 -g

本地:进入ng new创建的项目文件夹

npm uninstall typescript
npm cache clean
npm install typescript@2.0.0

我也将package.json中的Typescript版本从^2.0.0更改为2.0.0,但是直到我降级了本地Typescript安装后,该版本才起作用。


为什么人们对此表示不满,我想知道为什么这是一个坏主意。如果打字稿是一种转译语言并转换为javascript,它的安全性仅与您的浏览器一样,因此不会有任何风险,对吗?
user3505901
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.