Angular和Typescript:找不到名称


221

我将Angular(版本2)与TypeScript(版本1.6)一起使用,并且在编译代码时出现以下错误:

Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/change_detection/parser/locals.d.ts(4,42): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(1,25): Error TS2304: Cannot find name 'MapConstructor'.
    node_modules/angular2/src/core/facade/collection.d.ts(2,25): Error TS2304: Cannot find name 'SetConstructor'.
    node_modules/angular2/src/core/facade/collection.d.ts(4,27): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(4,39): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(7,9): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(8,30): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(11,43): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(12,27): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(14,23): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(15,25): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(94,41): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/collection.d.ts(95,22): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/collection.d.ts(96,25): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/lang.d.ts(1,22): Error TS2304: Cannot find name 'BrowserNodeGlobal'.
    node_modules/angular2/src/core/facade/lang.d.ts(33,59): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/promise.d.ts(1,10): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(3,14): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(8,32): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(9,38): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(10,35): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(10,93): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(11,34): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(12,32): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(12,149): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(13,43): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(72,32): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(74,17): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(78,184): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(83,182): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(107,37): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/proto_view_factory.d.ts(27,146): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(52,144): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(76,79): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(77,73): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(94,31): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(97,18): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(100,24): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(103,142): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(104,160): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/render/api.d.ts(281,74): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/zone/ng_zone.d.ts(1,37): Error TS2304: Cannot find name 'Zone'.

这是代码:

import 'reflect-metadata';
import {bootstrap, Component, CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/core';
@Component({
  selector: 'my-app',
  template: '<input type="text" [(ng-model)]="title" /><h1>{{title}}</h1>',
  directives: [ CORE_DIRECTIVES ]
})
class AppComponent {
  title :string;

  constructor() {
    this.title = 'hello angular 2';
  }
}
bootstrap(AppComponent);

看起来这里有一个问题github.com/angular/angular/issues/4902
rob

尝试添加以下导入,import {ROUTER_PROVIDERS} from 'angular2/router';但是我遇到了同样的问题,由于某种原因,它可以为我解决此问题...?!?

Answers:


52

已知问题:https : //github.com/angular/angular/issues/4902

核心原因:.d.tsTypeScript隐式包含的文件随编译目标的不同而不同,因此,es5即使目标在运行时中确实存在(例如chrome),在目标定位时也需要有更多环境声明。更多关于lib.d.ts


446
那么解决方案是什么?
user233232

3
2.0.0 alpha.45好,从node_modules / angular2 /包/分型/ ** / * d.ts用分型。
是Butuv

2
“ angular2”:“ 2.0.0-beta.3”有效,但是beta.4和beta.5似乎再次出现此问题,至少在像教程中
CorayThan

3
@Roj我仍然在beta 6中看到它,但是当使用对browser.d.ts的引用时它确实起作用了
inki

3
万岁!rc1加入了。
RoninCoder

105

2.0.0-beta.6(2016-02-11)的变更日志中提到了一个变通办法(在重大更改下列出):

如果使用--target = es5,则需要在应用程序中的某处添加一行(例如,在您称为bootstrap的.ts文件顶部):

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

(请注意,如果文件与node_modules不在同一目录中,则需要在该路径的开头添加一个或多个../。)

确保您具有正确的参考路径,我需要在开始时添加../才能使此工作正常进行。


3
这为我解决了许多错误,但我仍然遇到类似TS2304: Cannot find name 'module'TS2339: Property 'find' does not exist on type 'MyThing[]'....的错误,有什么想法吗?
mwijnands's

1
如果在要重用的软件包中使用angular怎么办?我尝试在带有此参考文件的文件中使用包的任何应用程序在tsc构建时都抱怨找不到该参考。
汉斯

5
在Angular中是否有针对新包结构的解决方案,我在新的@angular / ....结构中找不到browser.d.ts
I.devries

2
@ I.devries正确,他们已删除browser.d.ts。文件现在是index.d.ts,每个角组件都需要一个文件,因为每个角组件现在都分别安装在rc.0和更高版本中。您还需要安装“类型”-请参见上方的Khaled Al-Ansari和theUtherSide的答案。
维尔恩·詹森

1
我通过添加以下内容解决了这个问题:/// <参考路径=“ ../ typings / index.d.ts” />
Sako73,2016年

80

定位ES5时未定义诸如承诺之类的ES6功能。还有其他库,但是core-js是Angular团队使用的javascript库。它包含用于ES6的polyfill。

自问这个问题以来,Angular 2发生了很大变化。类型声明在Typescript 2.0 中容易使用。

npm install -g typescript

对于Angular 2中的ES6功能,您不需要键入。只需使用Typescript 2.0或更高版本,并在npm中安装@ types / core-js即可:

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

然后,将TypeRootsTypes属性添加到tsconfig.json中:

{
  "compilerOptions": {
    "target": "es5",
    "module": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "typeRoots": [
      "../node_modules/@types"
    ],
    "types" : [
      "core-js"
    ]
  },
  "exclude": [
    "node_modules"
  ]
}

如其他答案所述,这比使用“打字”要容易得多。有关更多信息,请参见Microsoft的博客文章:打字稿:声明文件的未来


1
我认为“类型”数组也属于“ compilerOptions”对象。但是除此之外,非常感谢,我整天都在为此苦苦挣扎。

@plexus谢谢!您对正确的editorOptions是正确的。我确定了答案。
David Rinck

感谢您的出色发帖,但是根据您提供的URL,甚至不必增加tsconfig.json,反正它确实可以工作:)至少它对我有用。所以,你需要做的唯一的事情就是安装所需的软件包
伊利亚Chernomordik

如果您typeRoots仅有的条目是,则可以删除node_modules/@types
Morgan Touverey Quilling

像个魅力。正如@ ilya-chernomordik所提到的,这对我也有效,而无需在tsconfig.json中添加TypeRootsTypes。就我而言,我还必须更新我的Gulp gulp-typescript 2.x插件,该插件使用TypeScript 1和嵌入式版本进行了转译,但是一旦更新,我就使用TypeScript 2并添加了@ types / core-js polyfill,组。非常感谢。
rscarter '17

49

对于那些angular.io刚刚讲完Angular2教程的人,这里是mvdluit的答案的扩展,确切地将代码放置在哪里:

main.ts应该看起来像这样:

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

import {bootstrap} from 'angular2/platform/browser'
import {AppComponent} from './app.component'
// Add all operators to Observable
import 'rxjs/Rx'

bootstrap(AppComponent);

请注意,您留在///正斜杠中,请勿删除它们。

参考:https : //github.com/ericmdantas/angular2-typescript-todo/blob/master/index.ts#L1


我使用VS2015 MVC6和Angular2 beta.14,如果将参考线放在_references.js其中将无法使用。像这样的答案建议必须在组件内部。此外,使用../../而不是../路径。
RoninCoder '16

@Hani您找到解决方法了吗?我将尝试升级到rc1并进行尝试
Rots Rots

这样打字就不见了。我想您需要单独安装它,当我这样做时,我也会添加很多无用的软件包。无论如何,即使完成所有这些操作,browser.d.tstypesings文件夹下也没有任何其他内容。只需将.js文件放在下dist。有一个名为的文件,typings.d.ts所以我认为这是新文件,但是并没有解决问题。为“ es6”构建作品,但IE抱怨。因此,坚持使用“ es5”构建,无需输入任何内容!:/
RoninCoder

@Hani有一个新答案。也许会起作用?npm install -g typings typings install
腐烂

降级为beta.15,并使用.d.ts来自打字包的内容。为了满足IE9 +的要求,必须针对es3进行构建。
RoninCoder

48

我可以使用以下命令解决此问题

typings install es6-promise es6-collections --ambient

请注意,您需要typings使上述命令生效,如果没有,请运行以下命令进行安装

npm install -g typings

更新

键入更新不会读--ambient--global对于某些人来说,您需要安装上述库的定义,只需使用以下命令

typings install dt~es6-promise dt~es6-collections --global --save

感谢@bgerth指出这一点。


9
对我来说是typings install dt~es6-promise dt~es6-collections --global --save
bgerth '16

1
@bgerth我猜是因为typings更新而改变了,我将在答案中添加您的解决方案
Khaled Al-Ansari

键入install dt〜es6-promise dt〜es6-collections --global --save对我有用。这个问题反复出现并且断断续续...此修复程序的希望使它能工作超过一天。
山姆

打字安装dt〜es6-promise dt〜es6-collection --global --save也为我工作
Rikku121 '16

33

当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)
    }
}

是的...向我的tsconfig.json文件中添加“ lib”:[“ es2016”,“ dom”]
Marvel Moe

这是对的。请小心,因为其中声明的某些类型可能存在。
Aluan Haddad

@Niels Steenbeek在这里正确。在进行Angular 2和4课程时,我遇到了相同的错误。但是,我的lib内容稍有不同:“ lib”:[“ es2015”,“ es2015.iterable”,“ dom”]
BoiseBaked

15

对于Angular 2.0.0-rc.0添加node_modules/angular2/typings/browser.d.ts将不起作用。首先向您的解决方案中添加types.json文件,内容如下:

{
    "ambientDependencies": {
        "es6-shim": "github:DefinitelyTyped/DefinitelyTyped/es6-shim/es6-shim.d.ts#7de6c3dd94feaeb21f20054b9f30d5dabc5efabd"
    }
}

然后更新package.json文件以包括以下内容postinstall

"scripts": {
    "postinstall": "typings install"
},

现在运行 npm install

同样,现在您也应该忽略typings文件中的tsconfig.json文件夹:

 "exclude": [
        "node_modules",
        "typings/main",
        "typings/main.d.ts"
    ]

更新资料

现在AngularJS 2.0正在使用core-js而不是es6-shim。请关注其快速入门的types.json文件,以获取更多信息。



15

您可以将代码添加到.ts文件的开头。

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

这对我有用。无需全局安装类型。试穿稳定角2.
戈皮纳特希瓦

我也使用Angular 2.0.0(发行版)为我工作
-JoshuaDavid

10

我在Angular 2 rc1上得到了这个。原来有些名称是通过键入v1与旧的0.x进行了更改。该browser.d.ts文件成为index.d.ts

运行后,typings install找到您的启动文件(您在其中进行引导)并添加:

/// <reference path="../typings/index.d.ts" /> (或没有 ../如果您的启动文件与打字文件夹位于同一文件夹中,则不包含)

添加index.d.ts到文件列表中tsconfig.json由于某些原因,无法。

另外,es6-shim不需要该包装。


7

我可以通过安装typings模块来解决此问题。

npm install -g typings
typings install

(使用ng 2.0.0-rc.1)


1
“缺少'typyings.json'。-(无依赖项)”。当我在app.ts文件的同一文件夹中运行命令时,它将返回此错误。我应该在哪里找到这个Types.json文件,何时应该运行命令?
尤利西斯·阿尔维斯

7

我遇到了同样的问题,并使用中的lib选项解决了它tsconfig.json。正如basarat在他的回答中所说,.d.tsTypeScript根据编译target选项隐式包含一个文件,但是可以通过以下方式更改此行为:lib选项。

您可以指定要包含的其他定义文件,而无需更改目标JS版本。例如,这是我当前compilerOptions对Typescript@2.1的一部分,它增加了对es2015功能的支持,而无需安装其他任何东西:

"compilerOptions": {
    "experimentalDecorators": true,
    "lib": ["es5", "dom", "es6", "dom.iterable", "scripthost"],
    "module": "commonjs",
    "moduleResolution": "node",
    "noLib": false,
    "target": "es5",
    "types": ["node"]
}

有关可用选项的完整列表,请查看官方文档

还要注意,我在代码中添加"types": ["node"]并安装npm install @types/node了支持功能require('some-module')


5
 typings install dt~es6-shim --save --global

并将正确的路径添加到index.d.ts

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

在@ angular-2.0.0-rc3上尝试


当我们在库项目中需要.d.ts文件时,此解决方案可以完美地工作。
罗宾·丁

4

如果npm install -g typings typings install仍然没有帮助,删除node_modules分型文件夹执行此命令前。


4

这就是每个人都在尝试做不同的事情的想法。我相信这些系统离最终版本还差得很远。

就我而言,我从rc.0更新为rc.5,出现了此错误。

我的解决办法是更改tsconfig.json。

{
    "compilerOptions": {
        "target": "es6", <-- It was es5
        "module": "system",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": false,
        "noImplicitAny": false,
        "outDir": "../wwwroot/app"
    },
    "compileOnSave": true,
    "exclude": [
        "../node_modules",
        "../typings/main"
    ]
}

1
这也解决了我的问题。RC版本似乎以es6为目标。
伊纳里(Inari)

您现在不再针对ES5。如果有,请更改"lib",而不是"target"
Aluan Haddad

4

在应用程序的主文件夹中添加typeing.d.ts,然后在那儿声明您想每次使用的变量

declare var System: any;
declare var require: any;

在type.d.ts中声明之后,应用程序中不会出现require的错误。


4

我是Angular的新手,但对我来说,只需导入Input即可找到解决方案。无法相信这一点,在另一块木板上找到了它。如果您遇到相同的问题,这是一个简单的解决方法,但是如果您的问题更复杂,则请阅读上面的内容。

穆克什

您必须在子组件的顶部导入这样的输入

import { Directive, Component, OnInit, Input } from '@angular/core';

3

我发现这个非常有用的文档在Angular 2的网站上。最终,它使我可以正常工作,而此处的其他答案(用于安装类型)使我失败,并出现各种错误。(但帮助我指引了正确的方向。)

它没有包含es6-promise和es6-collection,而是包含core-js,这对我有用了……与Angular2的核心ts定义没有冲突。此外,该文档还介绍了如何设置所有这些功能以使其在安装NPM时自动发生,以及如何修改您的typings.json文件。


2

Angular 2 RC1将node_modules/angular2目录重命名为node_modules/angular

如果您使用gulpfile将文件复制到输出目录,则可能仍然 node_modules/angular坐在那里,编译器可能会拾取该。

因此,(仔细地)清除node_modulesBeta版本中的内容,并删除所有旧输入并重新运行typings install


或另类...从事其他工作4个月,等待最终版本从头开始(这就是我正在做的事情)
Simon_Weaver

2

好的,@ VahidN,我发现我需要

    "exclude": [
        "node_modules",
        "typings/main",
        "typings/main.d.ts"
    ]

tsconfig也一样,从停止错误es6-shim本身


2

请将以下语句导入到JS文件中。

import 'rxjs/add/operator/map';

我打算将项目升级到最新版本,因此将import './rxjs-extensions';app.component.ts与angular2教程中的rxjs-extensions文件一起添加到了我的文件中(包括您建议的行),并且似乎已消除了这些错误。
詹姆斯,

请您更具体一点。哪个JS文件?由Typescript编译的那个?主要?
毫米

2

可接受的答案无法提供可行的解决方案,大多数其他建议都提出了“三斜杠”解决方法,该解决方法不再可行,因为browser.d.tsAngular2最新RC已将其删除,因此不再可用。

我强烈建议按照typings此处几个解决方案的建议安装该模块,但是不必手动或全局安装它-有一种有效的方法可以仅在您的项目中以及在VS2015界面中执行此操作。这是您需要做的:

  • 添加typings在项目的package.json文件中。
  • 在每个NPM操作之后script,在package.json文件中添加一个块以执行/更新typings
  • typings.json在项目的根文件夹中添加一个包含对它的引用的文件core-js(总的来说要比es6-shimatm好)。

而已。

您也可以查看此其他SO线程,和/或阅读我的博客上的这篇文章以获取更多详细信息。


2

将我的dev分支合并到当前分支后,出现了此错误。我花了一些时间解决这个问题。正如您在下图中看到的,代码完全没有问题。

在此处输入图片说明

所以对我来说唯一的解决方法是重启VSCode


0

现在,您必须手动导入它们。

import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/timeout';
import 'rxjs/add/operator/delay';
import 'rxjs/add/operator/map';




this.http.post(url, JSON.stringify(json), {headers: headers, timeout: 1000})

         .retry(2)

         .timeout(10000, new Error('Time out.'))

         .delay(10)

         .map((res) => res.json())
        .subscribe(
          (data) => resolve(data.json()),
          (err) => reject(err)
        );

-3

更新tsconfig.json,更改

"target": "es5"

"target": "es6"

这可能会导致您的JavaScript输出与旧版浏览器不兼容。
汤姆·罗宾逊
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.