Кутовий і Сценарій: Неможливо знайти імена


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/isissue/4902
грабувати

Спробуйте додати наступний імпорт. import {ROUTER_PROVIDERS} from 'angular2/router';Я отримую ту саму проблему, і чомусь це вирішує для мене ...?!?
грабувати

Відповіді:


52

Відомий випуск: https://github.com/angular/angular/isissue/4902

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


446
То яке рішення?
користувач233232

3
2.0.0-alpha.45 добре, використовуйте типінги з node_modules / angular2 / bundles / typping / ** / *. D.ts
Бутув

2
"angular2": "2.0.0-beta.3" працює, але, здається, у beta.4 та beta.5 ця проблема знову виникає, принаймні під час налаштування вашого проекту, як у підручнику
CorayThan

3
@Roj Я все ще бачу це в бета-версії 6, але це працює, коли використовується посилання на browser.d.ts
inki

3
Ура! rc1 приєднався до цього.
RoninCoder

105

Існує обхід, що згадується в журналі змін для 2.0.0-beta.6 (2016-02-11) (перераховано під порушеннями змін):

Якщо ви використовуєте --target = es5, вам потрібно буде додати рядок десь у вашій програмі (наприклад, у верхній частині файлу .ts, куди ви викликаєте bootstrap):

///<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

1
Що робити, якщо ви використовуєте кутовий у пакеті, призначеному для повторного використання? Будь-яка програма, яку я намагаюся використовувати пакет із файлом із цією посиланням, скаржиться на час створення tsc, що не може знайти це посилання.
Ганс

5
Чи є рішення для нової структури пакету в Angular, я не можу знайти browser.d.ts у новій структурі @angular / ....
I.devries

2
@ I.devries Правильно, вони видалили browser.d.ts. Файли тепер index.d.ts, і вам потрібен по одному для кожного кутового компонента, оскільки кожен зараз встановлюється окремо в rc.0 та пізніших версіях. Вам також потрібно встановити "типізацію" - див. Відповіді Халед Аль-Ансарі та TheUtherSide вище.
Верн Дженсен

1
Я вирішив це, додавши: /// <опорний шлях = "../ typping / index.d.ts" />
Sako73

80

Особливості ES6, такі як обіцянки, не визначаються при націленні на ES5. Є й інші бібліотеки, але core-js - це бібліотека javascript, яку використовує команда Angular. Він містить поліфіли для ES6.

Кутовий 2 сильно змінився з того часу, як було задано це питання. Декларації типу набагато простіше використовувати в Typescript 2.0.

npm install -g typescript

Для функцій ES6 у куті 2 типи не потрібні. Просто використовуйте typecript 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"
  ]
}

Це набагато простіше, ніж використання типінгу, як пояснено в інших відповідях. Докладнішу інформацію див. У блозі Майкрософт: Типовий сценарій: Майбутні файли декларації


1
Я думаю, що масив «типів» також належить до об’єкта «compilerOptions». Але крім цього, дякую багато, я цілий день боровся з цим фотом.
сплетіння

@plexus Дякую! Ви праві щодо компілятораOptions. Я зафіксував відповідь.
Девід Рінк

Дякую за чудову публікацію, але згідно з вказаною вами URL-адресою навіть не потрібно збільшувати tsconfig.json, вона все одно справді працює все одно :) Принаймні, це зробило для мене. Тож єдине, що вам потрібно зробити - це встановити необхідний пакет
Ілля Чорномордик

Ви навіть можете видалити, typeRootsякщо у вас є єдиний запис node_modules/@types.
Морган Тувері Квілінг

Як принадність. Як згадував @ ilya-chernomordik, це також працювало для мене без додавання TypeRootsта Typesдо tsconfig.json. У моєму випадку я також повинен був оновити свій плагін Gulp gulp-typecript 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


Я використовую VS2015 MVC6 та Angular2 beta.14, якщо розмістити в ньому опорну лінію, _references.jsвона не працюватиме. Повинен бути всередині компонента, як підказує ця відповідь. Крім того, використовуйте ../../замість ../шляху.
RoninCoder

@Hani Ви знайшли шлях до цього ще? Я спробую оновити до rc1 і спробувати його
Rots

Тож типінгів уже немає. Я думаю, вам потрібно буде встановити це окремо, і коли я це зробити, я також додаю багато непотрібних пакетів. У всякому разі, навіть після того, як все це зробити, більше browser.d.tsнемає папки під типізацією. Просто .jsфайли під dist. Є файл з назвою, typings.d.tsтому я подумав, що це новий, але це не вирішило проблему. Створення для 'es6' працює, але IE скаржиться. Тож застрягли з побудовою 'es5' і без типізацій! : /
RoninCoder

@Hani Є нова відповідь. Можливо, це спрацює? npm install -g typings typings install
Rots

Зменшено до бета-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

1
@bgerth Я думаю, що це змінилося через typingsоновлення, я додам ваше рішення до відповіді
Халед Аль-Ансарі

типінги встановити dt ~ es6-promis dt ~ es6-collection --global --save працював на мене. Ця проблема повторюється і переривається ... thx для цього виправлення дозволяє сподіватися, що вона працює довше, ніж день.
Сем

типінг встановити dt ~ es6-promis dt ~ es6-collection --global --сото працював і для мене
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 для отримання додаткової інформації.


Виникла проблема з цією помилкою в rc0 github.com/angular/angular/isissue/4902#issuecomment-216495769
ssuperczynski

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. Де я повинен знайти цей файл typings.json , і коли слід запустити команду?
Улісс Алвес

7

У мене була така ж проблема, і я вирішив її за допомогою libпараметра в tsconfig.json. Як сказав basarat у своїй відповіді , .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 та typeings перед виконанням цієї команди.


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, здається.
Інарі

Тепер ви більше не орієнтуєтесь на ES5. Якщо що, змінити "lib", ні "target".
Aluan Haddad

4

додайте typing.d.ts в головну папку програми і там декларуйте змінну, яку ви хочете використовувати кожен раз

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

після заяви про це в typing.d.ts помилка вимагати не буде в програмі.


4

Я новачок у Angular, але для мене рішення було знайдено простим імпортом Input. Не можете взяти кредит за цей, знайшли його на іншій дошці. Це просте виправлення, якщо у вас виникають ті ж проблеми, але якщо ваші проблеми складніші, я прочитав би матеріали вище.

Mukesh :

вам потрібно імпортувати подібні дані вгорі дочірнього компонента

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

3

Я знайшов цього дуже корисним док на веб-сайті Angular 2. Нарешті, я дозволив мені нормально працювати, тоді як інші відповіді тут, щоб встановити типізацію, зірвали мене з різними помилками. (Але допоміг вести мене в правильному напрямку.)

Замість того, щоб включати es6-promis і колекції es6, він включає core-js, який зробив для мене трюк ... немає конфліктів з основними визначеннями Angular2. Крім того, у документі було роз'яснено, як налаштувати все це автоматично при встановленні NPM та як змінити файл typings.json.


2

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

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

Тому (обережно) витріть все, що у вас є node_modules, для бета-версій, а також видаліть усі старі типізації та повторіть запуск 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файлу rxjs-extensions з підручника angular2 (включаючи запропонований рядок), і, здається, ці помилки видалено.
Джеймс

Не могли б ви бути більш конкретними. Який файл JS? той, складений Typescript? головний?
мм_

2

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

Я настійно пропоную встановити typingsмодуль, як пропонують пару рішень тут, але це не обов’язково робити це вручну або глобально - є ефективний спосіб зробити це лише для вашого проекту та в інтерфейсі VS2015. Ось що потрібно зробити:

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

Це воно.

Ви також можете поглянути на цю іншу тему SO та / або прочитати цю публікацію в моєму блозі для отримання додаткової інформації.


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)
        );

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.