Angular и Typescript: не могу найти имена
Я использую 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);
Ответы
Ответ 1
Известная проблема: https://github.com/angular/angular/issues/4902
Основная причина: файл .d.ts
, неявно включенный в TypeScript, зависит от цели компиляции, поэтому при ориентации на es5
нужно иметь больше эмбиентных объявлений, даже если в действительности они присутствуют во время выполнения (например, хром). Подробнее о lib.d.ts
Ответ 2
В журнале изменений есть ссылка на 2.0.0-beta.6 (2016-02-11) (перечисленные ниже нарушение изменений):
Если вы используете --target = es5, вам нужно добавить строку где-нибудь в вашем приложении (например, в верхней части файла .ts, где вы вызываете бутстрап):
///<reference path="node_modules/angular2/typings/browser.d.ts"/>
(Обратите внимание, что если ваш файл находится не в том же каталоге, что и node_modules, вам нужно добавить один или несколько../в начало этого пути.)
убедитесь, что у вас правильный путь ссылки, мне нужно добавить ../ в начало, чтобы заставить это работать.
Ответ 3
Функции ES6, такие как promises, не определяются при настройке ES5. Существуют и другие библиотеки, но core-js - это библиотека javascript, которую использует команда Angular. Он содержит полисы для ES6.
Angular 2 сильно изменился с тех пор, как был задан этот вопрос. Объявления типа намного легче использовать в Typescript 2.0.
npm install -g typescript
Для функций ES6 в Angular 2 вам не нужны типы. Просто используйте Typescript 2.0 или выше и установите @types/core-js с помощью npm:
npm install --save-dev @types/core-js
Затем добавьте атрибуты TypeRoots и Типы в ваш 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 для получения дополнительной информации: Typescript: будущее файлов декларации
Ответ 4
Для тех, кто следит за Angular2 учебником по angular.io
только для того, чтобы быть явным, вот расширение ответа 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);
Обратите внимание, что вы оставляете в ///
косые черты, не удаляйте их.
ref: https://github.com/ericmdantas/angular2-typescript-todo/blob/master/index.ts#L1
Ответ 5
Мне удалось исправить это с помощью следующей команды
typings install es6-promise es6-collections --ambient
Обратите внимание, что вам нужно typings
, чтобы выполнить описанную выше команду, если у вас нет этой команды для ее установки
npm install -g typings
UPDATE
обновление тиков не читает --ambient
, оно стало --global
также для некоторых людей, вам нужно установить определения вышеупомянутых библиотек, просто используйте следующую команду
typings install dt~es6-promise dt~es6-collections --global --save
Благодаря @bgerth для указания этого.
Ответ 6
При использовании 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)
}
}
Ответ 7
Для Angular 2.0.0-rc.0
добавление node_modules/angular2/typings/browser.d.ts
не будет работать. Сначала добавьте файл typings.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
. Следуйте его быстрому запуску файла typings.json для получения дополнительной информации.
Ответ 8
вы можете добавить код в начале .ts файлов.
/// <reference path="../typings/index.d.ts" />
Ответ 9
Я получал это на 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
не нужен.
Ответ 10
Я смог исправить это, установив модуль typings
.
npm install -g typings
typings install
(с использованием ng 2.0.0-rc.1)
Ответ 11
У меня была та же проблема, и я решил ее использовать с опцией lib
в tsconfig.json
. Как сказал basarat в своем ответе, файл .d.ts
неявно включается TypeScript в зависимости от параметра compile 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')
в моем коде.
Ответ 12
typings install dt~es6-shim --save --global
и добавьте правильный путь к index.d.ts
///<reference path="../typings/index.d.ts"/>
Пробовал на @ angular -2.0.0-rc3
Ответ 13
Если npm install -g typings typings install
по-прежнему не помогает, удалите node_modules и папки с образцами перед выполнением этой команды.
Ответ 14
Вот что думают, как каждый пытается сделать что-то другое. Я считаю, что эти системы еще далеки от окончательной версии.
В моем случае, я обновил с 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"
]
}
Ответ 15
Я новичок в Angular, но для меня решение было найдено просто импортированием Input. Не могу взять кредит за это, нашел его на другой доске. Это простое исправление, если у вас такая же проблема, но если ваши проблемы сложнее, я бы прочитал выше.
Мукеш:
вам нужно импортировать входные данные, подобные этому в верхней части дочернего компонента
import { Directive, Component, OnInit, Input } from '@angular/core';
Ответ 16
Я нашел этот очень полезный документ на веб-сайте Angular 2. Это, наконец, позволило мне нормально работать, тогда как другие ответы здесь, чтобы установить типизацию, не помогли мне с различными ошибками. (Но помог привести меня в правильном направлении.)
Вместо включения es6-prom и es6-коллекций он включает в себя core-js, который помогло... никаких конфликтов с Angular2 определениями ядра ts. Кроме того, в документе объясняется, как настроить все это автоматически при установке NPM и как изменить файл typings.json.
Ответ 17
добавить typing.d.ts в основную папку приложения и там объявить переменную, которую вы хотите использовать каждый раз
declare var System: any;
declare var require: any;
после объявления этого параметра в файле typing.d.ts, ошибка для запроса не появится в приложении.
Ответ 18
Хороший звонок, @VahidN, я нашел, что мне нужно
"exclude": [
"node_modules",
"typings/main",
"typings/main.d.ts"
]
В моем tsconfig
тоже, чтобы остановить ошибки самого es6-shim
Ответ 19
Angular 2 RC1 переименовал каталог node_modules/angular2
в node_modules/angular
.
Если вы используете gulpfile для копирования файлов в выходной каталог, у вас, вероятно, все еще есть node_modules/angular
, сидящий там, который может быть захвачен компилятором и сбивает с толку само по себе.
Итак (аккуратно) уничтожьте то, что у вас есть в node_modules
, то есть для бета-версий, а также удалите все старые пиктограммы и запустите typings install
.
Ответ 20
Принятый ответ не обеспечивает жизнеспособного исправления, а большинство других предлагает обходной путь "тройной косой черты", который больше не является жизнеспособным, так как browser.d.ts
был удален последним RC Angular2 и, следовательно, не является доступны больше.
Я настоятельно рекомендую установить модуль typings
как предложено здесь несколькими решениями, но нет необходимости делать это вручную или глобально - есть эффективный способ сделать это только для вашего проекта и в интерфейсе VS2015. Вот что вам нужно сделать:
- добавьте
typings
в файл проекта package.json. - добавьте блок
script
в файл package.json
чтобы выполнять/обновлять typings
после каждого действия NPM. - добавьте файл
typings.json
в корневую папку проекта, содержащую ссылку на core-js
(в целом лучше, чем es6-shim
atm).
Это.
Вы также можете посмотреть эту другую SO-ветку и/или прочитать этот пост в моем блоге для получения дополнительной информации.
Ответ 21
Импортируйте инструкцию ниже в свой JS файл.
import 'rxjs/add/operator/map';
Ответ 22
Теперь вы должны импортировать их вручную.
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)
);
Ответ 23
Я получал эту ошибку после слияния моей ветки разработчика с моей текущей веткой. Я потратил некоторое время, чтобы решить проблему. Как вы можете видеть на изображении ниже, в кодах вообще нет проблем.
![enter image description here]()
Таким образом, единственное исправление сработало для меня, что перезапуск VSCode
Ответ 24
Обновить tsconfig.json
, изменить
"target": "es5"
к
"target": "es6"