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);
user233232
источник
Похоже, что здесь есть проблема github.com/angular/angular/issues/4902
грабить
Попробуйте добавить следующий импорт, import {ROUTER_PROVIDERS} from 'angular2/router';я получаю ту же проблему, и по какой-то причине это исправляет для меня ...?!?
ограбить

Ответы:

52

Известная проблема: https://github.com/angular/angular/issues/4902

Основная причина: .d.tsфайл, неявно включаемый в TypeScript, варьируется в зависимости от цели компиляции, поэтому при таргетинге необходимо иметь больше объединенных объявлений, es5даже если что-то действительно присутствует во время выполнения (например, chrome). Ещеlib.d.ts

basarat
источник
446
Так в чем же решение?
user233232
3
2.0.0-alpha.45 хорош, используйте наборы из node_modules / angular2 / bundles / typings / ** / *. D.ts
Are Butuv
2
«angular2»: «2.0.0-beta.3» работает, но у бета.4 и бета.5, похоже, эта проблема снова возникает, по крайней мере при настройке вашего проекта, как в учебнике
CorayThan
3
@Roj Я все еще вижу это в бета-версии 6, но она работает при использовании ссылки на browser.d.ts
inki
3
Ура! rc1 присоединился к этому.
RoninCoder
105

В журнале изменений для 2.0.0-бета.6 (2016-02-11) упоминается обходной путь (указанный в разделе критических изменений):

Если вы используете --target = es5, вам нужно будет добавить строку где-нибудь в вашем приложении (например, вверху файла .ts, где вы вызываете bootstrap):

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

(Обратите внимание, что если ваш файл не находится в той же директории, что и node_modules, вам нужно добавить один или несколько ../ в начало этого пути.)

убедитесь, что у вас есть правильный путь ссылки, мне нужно было добавить ../ к началу, чтобы это заработало .

mvdluit
источник
3
Это исправило много ошибок для меня, но я все еще получаю ошибки как TS2304: Cannot find name 'module'и TS2339: Property 'find' does not exist on type 'MyThing[]'.... Есть идеи?
Mwijnands
1
Что если вы используете angular в пакете, предназначенном для повторного использования? Любое приложение, которое я пытаюсь использовать пакет с файлом с этой ссылкой, жалуется во время сборки tsc, что оно не может найти эту ссылку.
Ганс
5
Есть ли решение для новой структуры пакета в Angular, я не могу найти browser.d.ts в новой структуре @angular / ....
I.devries
2
@ I.devries Правильно, они удалили browser.d.ts. Теперь это файлы index.d.ts, и вам нужен по одному для каждого углового компонента, поскольку каждый теперь устанавливается отдельно в rc.0 и новее. Вам также необходимо установить «типизацию» - см. Ответы Халеда Аль-Ансари и «Другой стороны» выше.
Верн Дженсен,
1
Я решил это, добавив: /// <reference path = "../ typings / index.d.ts" />
Sako73
80

Функции ES6, такие как обещания, не определяются при нацеливании на ES5. Есть и другие библиотеки, но core-js - это библиотека javascript, которую использует команда Angular. Содержит полифилы для ES6.

Angular 2 сильно изменился с тех пор, как был задан этот вопрос. Объявления типов гораздо проще использовать в Typescript 2.0.

npm install -g typescript

Для функций ES6 в Angular 2 вам не нужно печатать. Просто используйте typcript 2.0 или выше и установите @ types / core-js с npm:

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

Затем добавьте атрибуты TypeRoots и Types в ваш файл 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"
  ]
}

Это гораздо проще, чем использовать Typings, как объяснено в других ответах. См. Сообщение в блоге Microsoft для получения дополнительной информации: Машинопись: будущее файлов декларации

Дэвид Ринк
источник
1
Я думаю, что массив "types" также принадлежит объекту "compilerOptions". Но кроме этого, большое спасибо, я боролся с этим весь день.
сплетение
@plexus Спасибо! Вы правы насчет компилятора. Я исправил ответ.
Дэвид Ринк
Спасибо за отличный пост, но по предоставленному вами URL-адресу даже не нужно увеличивать tsconfig.json, он все равно действительно работает :) По крайней мере, он сделал для меня. Так что единственное, что вам нужно сделать, это установить необходимый пакет
Илья Черномордик
Вы даже можете удалить, typeRootsесли единственная запись у вас есть node_modules/@types.
Морган Тувери Квиллинг
Как колдовство. Как упоминал @ ilya-chernomordik, это также работало для меня без добавления TypeRootsи Typesк tsconfig.json. В моем случае мне также пришлось обновить мой плагин Gulp gpes-typescript 2.x, который распространялся с использованием и встроенной версии TypeScript 1, но как только я обновился, я использовал TypeScript 2 и добавил полифилл @ types / core-js, который был устанавливать. Большое спасибо.
rscarter
49

Для тех, кто следует учебнику по 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);

Обратите внимание, что вы оставляете в ///слешах, не удаляйте их.

ссылка: https://github.com/ericmdantas/angular2-typescript-todo/blob/master/index.ts#L1

Rots
источник
Я использую VS2015 MVC6 и Angular2 beta.14, если вы поместите опорную линию в _references.jsнее, она не будет работать. Должен быть внутри компонента, как предполагает этот ответ. Кроме того, используйте ../../вместо ../пути.
RoninCoder
@ Хани, ты уже нашел способ обойти это? Я попробую обновить до rc1 и попробую
Rots
Таким образом, наборы исчезли. Я думаю, вам нужно установить это отдельно, и когда я это сделаю, я также добавлю много ненужных пакетов. Во всяком случае, даже после всего этого, в browser.d.tsпапке для ввода текстов больше нет. Просто .jsфайлы под dist. Есть файл с именем, typings.d.tsтак что я подумал, что это новый, но это не решило проблему. Сборка для 'es6' работает, но IE жалуется. Так что застрял в сборке 'es5' и не печатал! : /
RoninCoder
@ Хани Есть новый ответ. Возможно, это будет работать? npm install -g typings typings install
гниет
Понизился до beta.15 и использовал то же самое .d.tsиз пакета typings. Также, чтобы соответствовать требованиям 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
1
@bgerth Я думаю, что это изменилось из-за typingsобновления, я добавлю ваше решение к ответу
Халед Аль-Ансари
Типы установки dt ~ es6-обещание dt ~ es6-коллекций --global --save работал для меня. Эта проблема повторяется и периодически ... спасибо, что исправление позволяет надеяться, что оно работает дольше, чем день.
Сэм
наборы текстов установить dt ~ es6-обещание dt ~ es6-коллекций --global --save работал для меня тоже
Rikku121
33

При наличии 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)
    }
}
Нильс Стинбек
источник
Да ... добавление "lib": ["es2016", "dom"] в мой файл tsconfig.json это исправило
Marvel Moe
Это верно. Просто будьте осторожны, потому что некоторые из объявленных типов могут отсутствовать .
Алуан Хаддад
@Niels Steenbeek это правильно здесь. Я столкнулся с такими же ошибками, выполняя упражнения для курсов Angular 2 и 4. Однако содержимое моей библиотеки немного отличается: "lib": ["es2015", "es2015.iterable", "dom"]
BoiseBaked
15

Для 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 файл для получения дополнительной информации.

VahidN
источник
Существует проблема с этой ошибкой в rc0 github.com/angular/angular/issues/4902#issuecomment-216495769
ssuperczynski
15

Вы можете добавить код в начале файла .ts.

/// <reference path="../typings/index.d.ts" />
user3543469
источник
Это сработало для меня. Нет необходимости устанавливать наборы глобально. Пробовал на стабильной угловой 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посылка была не нужна.

mbursill
источник
7

Я смог это исправить, установив typingsмодуль.

npm install -g typings
typings install

(С использованием ng 2.0.0-rc.1)

theUtherSide
источник
1
msgstr "" typyings.json "отсутствует. - (нет зависимостей)". Эта ошибка возвращается, когда я запускаю команду в той же папке файла app.ts. Где я должен найти этот файл typings.json и когда мне следует запустить команду?
Улисс Алвес
7

У меня была та же проблема, и я решил ее с помощью libопции в tsconfig.json. Как сказал Басарат в своем ответе , .d.tsфайл неявно включается в TypeScript в зависимости от параметра компиляции, 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 и папки для ввода текста перед выполнением этой команды.

tibersky
источник
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"
    ]
}
AFetter
источник
1
Это решило и мои проблемы. Похоже, версии для RC нацелены на es6.
Инари
Теперь вы больше не нацелены на ES5. Если что, поменяй "lib", нет "target".
Алуан Хаддад
4

добавьте typing.d.ts в основную папку приложения и там объявите переменную, которую вы хотите использовать каждый раз

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

после объявления этого в typing.d.ts ошибкатребовать в приложении не будет ..

НАРГИС ПАРВИН
источник
4

Я новичок в Angular, но для меня решение было найдено, просто импортировав Input. Не могу взять кредит на это, нашел его на другой доске. Это простое решение, если у вас возникла та же проблема, но если ваши проблемы более сложные, я прочел материал выше.

Мукеш :

Вы должны импортировать ввод, как это в верхней части дочернего компонента

import { Directive, Component, OnInit, Input } from '@angular/core';
Трипп Каннелла
источник
3

Я нашел этот очень полезный документ на сайте Angular 2. Это, наконец, позволило мне заставить все работать должным образом, в то время как другие ответы здесь, чтобы установить наборы, подвели меня с различными ошибками. (Но помог привести меня в правильном направлении.)

Вместо того, чтобы включать es6-обещание и es6-коллекции, он включает core-js, что помогло мне ... не противоречит основным определениям Angular2. Кроме того, в документе объясняется, как настроить все это так, чтобы оно происходило автоматически при установке NPM, и как изменить файл typings.json.

Верн Дженсен
источник
2

Angular 2 RC1 переименовал node_modules/angular2каталог в node_modules/angular.

Если вы используете gulpfile для копирования файлов в выходной каталог, у вас, вероятно, все еще есть node_modules/angular сидите, что может быть захвачено компилятором и запутать себя до чертиков.

Поэтому (осторожно) удалите все, что у вас есть node_modulesдля бета-версий, а также удалите все старые наборы и повторите попытку typings install.

Simon_Weaver
источник
или в качестве альтернативы ... работайте над другими вещами в течение 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файл rxjs-extensions из учебника angular2 (включая предложенную строку), и, похоже, эти ошибки были устранены.
Джеймс
Не могли бы вы быть более конкретным. Какой файл JS? тот, который скомпилирован Typescript? основной?
17
2

Принятый ответ не обеспечивает жизнеспособного исправления, а большинство других предлагает обходной путь «тройной косой черты», который больше не является жизнеспособным, так как browser.d.tsон был удален последними RC Angular2 и, таким образом, больше не доступен.

Я настоятельно рекомендую установить typingsмодуль, как предложено здесь несколькими решениями, но нет необходимости делать это вручную или глобально - есть эффективный способ сделать это только для вашего проекта и в интерфейсе VS2015. Вот что вам нужно сделать:

  • Добавить typings в файл package.json проекта.
  • добавить scriptблок в package.jsonфайл для выполнения / обновленияtypings после каждого действия NPM.
  • добавьте typings.jsonв корневую папку проекта файл, содержащий ссылку core-js(в целом лучше, чем es6-shimatm).

Вот и все.

Вы также можете посмотреть эту другую SO-ветку и / или прочитать эту запись в моем блоге для получения дополнительной информации.

Darkseal
источник
2

Я получал эту ошибку после слияния моей ветки разработчика с моей текущей веткой. Я потратил некоторое время, чтобы решить проблему. Как вы можете видеть на изображении ниже, в кодах вообще нет проблем.

введите описание изображения здесь

Таким образом, единственное исправление сработало для меня, что перезапуск 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 с более старыми браузерами.
Том Робинсон