Angular and Typescript: Can't find names
我将Angular(版本2)与TypeScript(版本1.6)结合使用,当我编译代码时,会得到以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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'. |
这是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import 'reflect-metadata'; import {bootstrap, Component, CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/core'; @Component({ selector: 'my-app', template: '<input type="text" [(ng-model)]="title" />{{title}}', directives: [ CORE_DIRECTIVES ] }) class AppComponent { title :string; constructor() { this.title = 'hello angular 2'; } } bootstrap(AppComponent); |
号
在2.0.0-beta.6(2016-02-11)的变更日志中提到了一项工作(列在"中断变更"下):
If you use --target=es5, you will need to add a line somewhere in your application (for example, at the top of the .ts file where you call bootstrap):
号
1 | ///<reference path="node_modules/angular2/typings/browser.d.ts"/> |
(Note that if your file is not in the same directory as node_modules, you'll need to add one or more ../ to the start of that path.)
号
确保您有正确的引用路径,我需要在开始时添加../以使其正常工作。
ES6功能,比如承诺,在针对ES5时没有定义。还有其他库,但是核心JS是Angular团队使用的JavaScript库。它包含ES6的多填充物。
自从这个问题被问起,角2已经改变了很多。类型声明在typescript 2.0中更容易使用。
1 | npm install -g typescript |
。
对于角2中的ES6功能,您不需要打字。只需使用typescript 2.0或更高版本并安装@types/core js和NPM:
1 | npm install --save-dev @types/core-js |
号
然后,将typeroots和types属性添加到tsconfig.json中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { "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的博客文章:typescript:声明文件的未来
已知问题:https://github.com/angular/angular/issues/4902
核心原因:typescript隐式包含的
对于那些遵循
您的
1 2 3 4 5 6 7 8 | /// <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
我能用下面的命令解决这个问题
1 | typings install es6-promise es6-collections --ambient |
请注意,您需要
1 | npm install -g typings |
。
更新
typings update没有读取
1 | typings install dt~es6-promise dt~es6-collections --global --save |
感谢@bgerth指出这一点。
当typescript大于等于2时,tsconfig.json中的"lib"选项将执行该操作。不需要打字。https://www.typescriptlang.org/docs/handbook/compiler-options.html网站
1 2 3 4 5 6 | { "compilerOptions": { "target":"es5", "lib": ["es2016","dom"] //or es6 instead of es2016(es7) } } |
。
对于
1 2 3 4 5 | { "ambientDependencies": { "es6-shim":"github:DefinitelyTyped/DefinitelyTyped/es6-shim/es6-shim.d.ts#7de6c3dd94feaeb21f20054b9f30d5dabc5efabd" } } |
然后更新
1 2 3 | "scripts": { "postinstall":"typings install" }, |
。
现在运行
现在您也应该忽略您的
1 2 3 4 5 | "exclude": [ "node_modules", "typings/main", "typings/main.d.ts" ] |
更新
现在AngularJS2.0使用的是
您可以在.ts文件的开头添加代码。
1 | /// <reference path="../typings/index.d.ts" /> |
号
我在角2 RC1上得到这个。原来有些名字是用v1和旧的0.x来改变的。
运行
将
此外,不需要
我也遇到了同样的问题,我用
可以指定要包含的其他定义文件,而不更改目标JS版本。例如,这是我当前的
1 2 3 4 5 6 7 8 9 | "compilerOptions": { "experimentalDecorators": true, "lib": ["es5","dom","es6","dom.iterable","scripthost"], "module":"commonjs", "moduleResolution":"node", "noLib": false, "target":"es5", "types": ["node"] } |
有关可用选项的完整列表,请查看正式文档。
还要注意,我在代码中添加了
我可以通过安装
1 2 | npm install -g typings typings install |
。
(使用NG 2.0.0-RC.1)
1 | typings install dt~es6-shim --save --global |
并将正确的路径添加到index.d.ts
1 | ///<reference path="../typings/index.d.ts"/> |
号
尝试于@angular-2.0.0-rc3
如果
这就是每个人都在尝试做不同的事情。我相信这些系统离最终版本还很远。
在我的例子中,我从rc.0更新到rc.5,出现了这个错误。
我修复的是更改tsconfig.json。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "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" ] } |
在应用程序的主文件夹中添加typing.d.ts,然后在那里声明每次要使用的变量
1 2 | declare var System: any; declare var require: any; |
在typing.d.ts中声明后,应用程序中不会出现require错误。
我是角的新手,但对我来说,解决方案是通过简单地导入输入找到的。这一个不值得称赞,在另一个板上找到了。如果你有同样的问题,这是一个简单的解决方法,但是如果你的问题更复杂,我会阅读上面的内容。
穆克什:
you have to import input like this at top of child component
号
1 | import { Directive, Component, OnInit, Input } from '@angular/core'; |
我在Angular2的网站上找到了这个非常有用的医生。它最终让我的工作正常,而这里的其他答案,安装打字,失败了我与各种错误。(但帮助我找到了正确的方向。)
它不包括ES6 Promise和ES6系列,而是包含了核心JS,这对我有好处……与Angular2的核心TS定义没有冲突。另外,该文档还解释了如何在安装NPM时自动设置所有这些,以及如何修改typings.json文件。
接受的答案并不能提供一个可行的解决方案,而且大多数其他答案都表明"三重斜杠"的解决方案已经不可行了,因为
我强烈建议按照这里的一些解决方案的建议安装
- 在项目的package.json文件中添加
typings 。 - 在
package.json 文件中添加一个script 块,在每次NPM操作后执行/更新typings 。 - 在项目的根文件夹中添加一个
typings.json 文件,其中包含对core-js 的引用(总体上优于es6-shim atm)。
就这样。
你也可以看看这另一个SO线程和/或阅读我的博客上的这篇文章,了解更多的细节。
Angular2RC1将
如果您使用一个gulpfile将文件复制到一个输出目录中,那么您可能仍然有
所以(小心地)删除你在
在JS文件中导入下面的语句。
1 | import 'rxjs/add/operator/map'; |
。
打得好,@vahidn,我发现我需要
1 2 3 4 5 | "exclude": [ "node_modules", "typings/main", "typings/main.d.ts" ] |
。
在我的
在将dev分支合并到当前分支之后,我得到了这个错误。我花了些时间来解决这个问题。如下图所示,代码完全没有问题。
。
所以对我来说唯一有效的解决方法就是重新启动vscode
现在您必须手动导入它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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) ); |
。
更新
1 | "target":"es5" |
。
到
1 | "target":"es6" |
。