首页 文章

Angular:找不到Promise,Map,Set和Iterator

提问于
浏览
165

在安装Angular之后,Typescript编译器不断发现一些关于找不到 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

The errors:

................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'.

19 回答

  • 1

    如果使用带有类型v1.0的Angular2 RC1,请使用以下命令:

    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

  • 0

    由于Angular 2进入RC 0,/ angular2 /typings / broowser.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" />
    
  • 8

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

  • 0

    Angular 5 with 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"
        ]
      }
    

    More about @types with typescript 2.0.0.

    安装示例:

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

    Duplicate Identifier errors

    这很可能是因为重复的ecmascript 6类型已经从其他地方导入,很可能是旧的es6-shim .

    仔细检查 typings.d.ts 确保没有对 es6 的引用 . 如果您有,请从您的typings目录中删除对 es6 的任何引用 .

    For Example:

    这将与typings.json中的 types:['core-js'] 冲突 .

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

    tsconfig.json 中的types数组中包含 core-js 应该是从中导入的唯一位置 .

    Angular CLI 1.0.0-beta.30

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

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

    Webstorm/Intellij Users using the Angular CLI

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

    Tsconfig compilerOptions lib vs types

    如果您不想安装核心js类型定义,那么typescript会包含一些es6库 . 这些是通过tsconfig中的 lib: [] 属性使用的 .

    请看这里例如:https://www.typescriptlang.org/docs/handbook/compiler-options.html

    注意:如果未指定--lib,则会注入默认库 . 注入的默认库是:►For--target ES5:DOM,ES5,ScriptHost►For--target ES6:DOM,ES6,DOM.Iterable,ScriptHost

    tl;dr

    简短回答 "lib": [ "es6", "dom" ]"types": ["core-js"] 可用于解析 can't find Promise,Map, Set and Iterator . 但是,使用它们会导致重复的标识符错误

  • 3

    这对我有用 .

    检查是否存在 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 后,运行

    typings install
    

    然后重启服务器 .

  • 3

    如果您因为在Visual Studio 2017中看到这些错误而来到这里,那么如果您成功编译,则会遇到与上述不同的问题 . 这是因为语言服务不会选择你的tsconfig.json .

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

    您必须将tsconfig.json的Build Action设置为“Content”(右键单击 - > Properties),然后VS将接收它 .

  • 8

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

    • 确保为我的特定版本的TypeScript 2.9安装了TypeScript SDK(通过Visual Studio Installer)

    • 确保将Module System项目属性设置为与我的tsconfig.json中的属性相匹配:ES2015 . 如果tsconfig文件位于项目的根目录中,则通常会自动同步 . 但是,由于我使用的是VS Angular模板,因此它将这些文件放在"ClientApp"子文件夹中,并且未设置Module System项目属性 .

    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": "./"
      }
    }
    
  • 5

    角度2决赛

    - es5支持(与TS 2.0.0完美配合)

    如果您同时将两个类型安装在一起 es6-shimcore-js ,则现在不支持每次更新 es6-shim . 通过在tsconfig.json中提及删除 es6-shim 类型 . 您现在可以在 main.ts 中为 es5 支持下面的 core-js 输入

    ///<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 格式 .

  • 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安装之前它没有用 .

  • 1

    我也有同样的问题 - “未找到承诺” - 当代码想要创建一个Promise对象时 .

    尝试在stackoverflow上找到一些解决方案,包括取出System.config()以形成system.js并将其包含在index.html中的解决方案 .

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

  • 172

    另一个好方案 . 您需要在root中创建一个文件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 . 在某些旧版本的浏览器之后,您的Web应用程序不支持 .

  • -1

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

  • 63

    更新为angular-2.0.0-rc.4

    TLDR;

    • Transpile to es6

    • 错误消失(带有一些陷阱) .

    • Transpile to es5

    • 安装打字

    • 安装es6垫片

    • 确保它与您的代码一起编译 .

    • 错误消失了 .

    对于读者:

    选项1:透明到es6或es2015

    tsconfig.json:

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

    请记住uglifyjs does not support es6 at the moment . 这可能会影响您制作 生产环境 包 .

    选项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
    

    If you go this route, you need to make sure that the typescript compiler can find the .d.ts file.

    你有两个选择:

    一个 . 确保您的tsconfig.json与typings文件夹处于同一级别 .

    湾在main.ts文件中包含一个引用,其中您的angular2应用程序是自举的 .

    选项A:确保您的tsconfig.json与typings文件夹处于同一级别 .

    注意:请勿使用exclude标志排除typings文件夹 .

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

    选项B:在引导程序之前在主文件中引用(不要这样做):

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

    main.ts:

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

    我有类似的问题,它没有识别 Promise.resolve() 方法 . 我在 tsconfig.json 中将 "target" 值从ES5更改为 ES6 . 这解决了这个问题 .

    希望这可以帮助 .

  • 1

    另一种可能的解决方案是重新安装类型:
    "angular2": "2.0.0-beta.15" 这对我有用

    • npm clean cache

    • npm install

    • npm install -g typings

    • 从项目中删除 typings 目录(安装了打包模块的目录)

    • typings install

    • npm run

  • 42

    我正在训练一个angular2教程(英雄) .
    安装@ types / core-js在这些答案中注释后,我收到了"Duplicate identifier"错误 .
    在我的例子中,它被解决为删除tsconfig.json中的lib行 .

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

  • -1

    当Typescript> = 2时,tsconfig.json中的"lib"选项将完成这项工作 . 不需要打字 . https://www.typescriptlang.org/docs/handbook/compiler-options.html

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

    我设法解决了这个问题,而无需向TS引导文件添加任何三斜杠引用,更改为ES6(这带来了一堆问题,就像@DatBoi所说)更新VS2015的 NodeJS 和/或 NPM 捆绑构建或全局安装 typings .

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

    • 在项目的 package.json 文件中添加了 typings .

    • package.json 文件中添加了 script 块,以便在每次NPM操作后执行/更新 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"
      }
    }
    

    JasmineNode 不是必需的,但我建议保留它们以防将来需要) .

    这个修复程序适用于Angular2 RC1到RC4,这是我需要的,但我认为它也将修复与其他支持ES6的库包的类似问题 .

    AFAIK,我认为这是解决它的最简洁方法,而不会弄乱VS2015的默认设置 .

    有关该问题的更多信息和详细分析,我还建议在我的博客上使用read this post .

  • 6

    我的文件结构如下:

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

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

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

相关问题