Angular e datilografado: não é possível encontrar nomes

221

Estou usando Angular (versão 2) com TypeScript (versão 1.6) e quando compilo o código, recebo estes erros:

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'.

Este é o código:

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
fonte
Parece que há um problema para que aqui github.com/angular/angular/issues/4902
Rob
Tente adicionar a seguinte importação import {ROUTER_PROVIDERS} from 'angular2/router';: estou tendo o mesmo problema e, por algum motivo, isso corrige isso para mim ...?!?
rob

Respostas:

52

Um problema conhecido: https://github.com/angular/angular/issues/4902

Razão principal: o .d.tsarquivo incluído implicitamente pelo TypeScript varia de acordo com o destino de compilação; portanto, é necessário ter mais declarações de ambiente ao direcionar, es5mesmo que haja coisas realmente presentes nos tempos de execução (por exemplo, chrome). Mais sobrelib.d.ts

basarat
fonte
446
Então qual é a solução?
user233232
3
2.0.0-alpha.45 é bom, use digitações de node_modules / angular2 / bundles / typings / ** / *. D.ts
São Butuv
2
"angular2": "2.0.0-beta.3" funciona, mas beta.4 e beta.5 parecem ter esse problema novamente, pelo menos ao configurar seu projeto como no tutorial
CorayThan
3
@Roj Eu ainda estou vendo isso em beta 6, mas ela não funciona quando se utiliza a referência ao browser.d.ts
inki
3
hooray! rc1 se juntou a isso.
RoninCoder 10/05
105

Existe uma solução alternativa mencionada no changelog para 2.0.0-beta.6 (11-02-2016) (listado em alterações recentes):

Se você usar --target = es5, precisará adicionar uma linha em algum lugar do seu aplicativo (por exemplo, na parte superior do arquivo .ts onde você chama o bootstrap):

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

(Observe que, se seu arquivo não estiver no mesmo diretório que node_modules, você precisará adicionar um ou mais ../ ao início desse caminho.)

verifique se você tem o caminho de referência correto, eu precisava adicionar ../ ao início para que isso funcione.

mvdluit
fonte
3
Isso corrigiu muitos erros para mim, mas ainda recebo erros como TS2304: Cannot find name 'module'e TS2339: Property 'find' does not exist on type 'MyThing[]'.... Alguma idéia?
24516 mwijnands
1
E se você usar angular em um pacote destinado à reutilização? Qualquer aplicativo que eu tente usar um pacote com um arquivo com essa referência reclama no tsc build time que ele não consegue encontrar essa referência.
217 Hans
5
Existe uma solução para a nova estrutura do pacote no Angular, eu não posso encontrar um browser.d.ts na estrutura nova @angular / ....
I.devries
2
@ I.devries Correto, eles removeram o browser.d.ts. Os arquivos agora são index.d.ts e você precisa de um para cada componente angular, já que cada um agora é instalado separadamente no rc.0 e posterior. Você também precisa instalar "digitações" - veja as respostas de Khaled Al-Ansari e theUtherSide acima.
Vern Jensen
1
Eu o resolvi adicionando: /// <reference path = "../ typings / index.d.ts" />
Sako73 31/08/16
80

Recursos do ES6, como promessas, não são definidos ao segmentar o ES5. Existem outras bibliotecas, mas core-js é a biblioteca javascript usada pela equipe Angular. Ele contém polyfills para ES6.

O Angular 2 mudou muito desde que essa pergunta foi feita. As declarações de tipo são muito mais fáceis de usar no Typescript 2.0.

npm install -g typescript

Para os recursos do ES6 no Angular 2, você não precisa de Typings. Basta usar o typescript 2.0 ou superior e instalar @ types / core-js com o npm:

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

Em seguida, adicione os atributos TypeRoots e Types ao seu 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"
  ]
}

Isso é muito mais fácil do que usar Typings, conforme explicado em outras respostas. Consulte a publicação no blog da Microsoft para obter mais informações: Texto datilografado: O futuro dos arquivos de declaração

David Rinck
fonte
1
Eu acho que a matriz "types" também pertence ao objeto "compilerOptions". Mas fora isso, muito obrigado, eu estava lutando com isso por todo o dia.
plexus
@plexus Obrigado! Você está certo sobre as opções do compilador. Eu consertei a resposta.
David Rinck 27/09/16
Obrigado pela ótima postagem, mas de acordo com a URL que você forneceu, nem é necessário aumentar o tsconfig.json, ele realmente funciona mesmo assim :) Pelo menos funcionou para mim. Portanto, a única coisa que você precisa fazer é instalar o pacote necessário
Ilya Chernomordik 5/16
Você pode até remover typeRootsse a única entrada que você possui for node_modules/@types.
Morgan Touverey Quilling
Como um encanto. Como o @ ilya-chernomordik mencionou, isso também funcionou para mim sem a adição TypeRootse o Typestsconfig.json. No meu caso, eu também tive que atualizar meu plug-in Gulp gulp-typescript 2.x, que estava transpilando usando e incorporando a versão do TypeScript 1, mas depois que atualizei, usei o TypeScript 2 e adicionei o polyfill @ types / core-js. conjunto. Muito Obrigado.
rscarter
49

Para aqueles que seguem o tutorial do Angular2 angular.ioapenas para ser explícito, aqui está uma expansão da resposta do mvdluit sobre exatamente onde colocar o código:

Você main.tsdeve ficar assim:

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

Observe que você deixa nas ///barras, não as remova.

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

Rots
fonte
Eu uso o VS2015 MVC6 e Angular2 beta.14, se você colocar a linha de referência, _references.jsela não funcionará. Tem que estar dentro do componente como esta resposta sugere. Além disso, use em ../../vez de ../para o caminho.
RoninCoder
@Hani, você já encontrou uma maneira de contornar isso? Vou tentar upgrade para RC1 e experimentá-lo
Rots
Então as digitações se foram. Eu acho que você precisará instalá-lo separadamente e, quando o faço, também recebo muitos pacotes inúteis. De qualquer forma, mesmo depois de fazer tudo isso, não há mais browser.d.tsna pasta de digitações. Apenas .jsarquivos abaixo dist. Há um arquivo chamado, typings.d.tsentão eu pensei que era o novo, mas não resolveu o problema. Construir para 'es6' funciona, mas o IE reclama. Tão preso com a construção 'es5' e sem digitações! : /
RoninCoder
@Hani Há uma nova resposta. Talvez funcione? npm install -g typings typings install
Poderia Rots
Desclassificado para beta.15 e usado o mesmo .d.tsdo pacote de digitações. Também para atender aos requisitos do IE9 +, tive que construir para o es3.
RoninCoder 15/05
48

Consegui consertar isso com o seguinte comando

typings install es6-promise es6-collections --ambient

Observe que você precisa typingsfazer o comando acima funcionar, se você não o tiver, execute o seguinte comando para instalá-lo

npm install -g typings

ATUALIZAR

se a atualização de digitação não ler --ambient, tornou-se --globaltambém para algumas pessoas que você precisa instalar as definições das bibliotecas acima, basta usar o seguinte comando

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

Obrigado a @bgerth por apontar isso.

Khaled Al-Ansari
fonte
9
Para mim, foitypings install dt~es6-promise dt~es6-collections --global --save
bgerth
1
@bgerth Eu acho que mudou por causa da typingsatualização, vou acrescentar a sua solução para a resposta
Khaled Al-Ansari
datilografias instalam dt ~ es6-promessa dt ~ es6-collections --global --save funcionou para mim. Esse problema é recorrente e intermitente ... thx para essa correção permite que a esperança funcione por mais de um dia.
19416 Sam
tipagens instalar dt ~ ES6-prometer dt ~ ES6-coleções --global --save trabalhou para mim também
Rikku121
33

Ao ter o Typecript> = 2, a opção "lib" no tsconfig.json fará o trabalho. Não há necessidade de digitações. https://www.typescriptlang.org/docs/handbook/compiler-options.html

{
    "compilerOptions": {
        "target": "es5",
        "lib": ["es2016", "dom"] //or es6 instead of es2016(es7)
    }
}
Niels Steenbeek
fonte
Yup ... acrescentando "lib": [ "es2016", "dom"] para o meu arquivo tsconfig.json fixa-lo
Marvel Moe
Isto está certo. Apenas tenha cuidado, pois alguns dos tipos declarados podem não estar presentes.
Aluan Haddad
@ Niels Steenbeek está correto aqui. Eu encontrei os mesmos erros ao fazer os exercícios para os cursos Angular 2 e 4. No entanto, o conteúdo da minha lib era um pouco diferente: "lib": ["es2015", "es2015.iterable", "dom"]
BoiseBaked
15

Para Angular 2.0.0-rc.0adicionar node_modules/angular2/typings/browser.d.tsnão vai funcionar. Primeiro adicione o arquivo typings.json à sua solução, com este conteúdo:

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

E atualize o package.jsonarquivo para incluir isso postinstall:

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

Agora corra npm install

Agora também você deve ignorar a typingspasta no seu tsconfig.jsonarquivo:

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

Atualizar

Agora o AngularJS 2.0 está usando em core-jsvez de es6-shim. Siga o arquivo typings.json de início rápido para obter mais informações.

VahidN
fonte
Há um problema com este erro no rc0 github.com/angular/angular/issues/4902#issuecomment-216495769
ssuperczynski
15

você pode adicionar o código no início dos arquivos .ts.

/// <reference path="../typings/index.d.ts" />
user3543469
fonte
Isso funcionou para mim. Não há necessidade de instalar tipagens globalmente. Tentei em angular estável 2.
Gopinath Shiva
Trabalhou para mim também, usando Angular 2.0.0 (release)
JoshuaDavid
10

Eu estava conseguindo isso no Angular 2 rc1. Acontece que alguns nomes foram alterados com as letras v1 versus o antigo 0.x. Os browser.d.tsarquivos se tornaram index.d.ts.

Depois de executar, typings installlocalize seu arquivo de inicialização (onde você inicializa) e adicione:

/// <reference path="../typings/index.d.ts" />(ou sem o ../arquivo se estiver na mesma pasta que a pasta de digitações)

A adição index.d.tsà lista de arquivos no tsconfig.jsonnão funcionou por algum motivo.

Além disso, o es6-shimpacote não era necessário.

mbursill
fonte
7

Consegui consertar isso instalando o typingsmódulo.

npm install -g typings
typings install

(Usando o ng 2.0.0-rc.1)

theUtherSide
fonte
1
"O 'typyings.json' está ausente. - (Sem dependências)". Ele retorna esse erro quando executo o comando na mesma pasta do arquivo app.ts. Onde devo encontrar esse arquivo typings.json e quando devo executar o comando?
Ulysses Alves
7

Eu tive o mesmo problema e eu resolvi-lo usando a libopção tsconfig.json. Como dito por basarat em sua resposta , um .d.tsarquivo é implicitamente incluído pelo TypeScript, dependendo da targetopção de compilação, mas esse comportamento pode ser alterado com a libopção.

Você pode especificar arquivos de definição adicionais a serem incluídos sem alterar a versão JS de destino. Por exemplo, isso faz parte do meu atual compilerOptionspara [email protected] e adiciona suporte para es2015recursos sem instalar mais nada:

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

Para a lista completa de opções disponíveis, consulte o documento oficial .

Observe também que adicionei "types": ["node"]e instalei npm install @types/nodepara oferecer suporte require('some-module')ao meu código.

Jiayi Hu
fonte
5
 typings install dt~es6-shim --save --global

e adicione o caminho correto para index.d.ts

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

Tentei em @ angular-2.0.0-rc3

Ali Salehi
fonte
Essa solução funciona perfeitamente quando precisamos do arquivo .d.ts em um projeto de biblioteca.
Robin Ding
4

Se npm install -g typings typings installainda não ajudar, apagar node_modules e tipagens pastas antes de executar este comando.

tibersky
fonte
4

É assim que pensamos como todos estão tentando fazer algo diferente. Eu acredito que esses sistemas ainda estão longe da versão final.

No meu caso, atualizei de rc.0 para rc.5 esse erro apareceu.

Meu conserto foi alterar o 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
fonte
1
Isso resolveu meus problemas também. As versões RC estão visando es6, parece.
Inari
Agora você não está mais segmentando o ES5. Se alguma coisa mudar "lib", não "target".
Aluan Haddad
4

adicione o type.d.ts na pasta principal do aplicativo e declare a variável que você deseja usar sempre

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

depois de declarar isso em digitação.d.ts, o erro for require não aparecerá no aplicativo.

NARGIS PARWEEN
fonte
4

Eu sou novo no Angular, mas para mim a solução foi encontrada simplesmente importando o Input. Não posso receber crédito por este, encontrei-o em outro fórum. Esta é uma correção simples, se você estiver tendo o mesmo problema, mas se seus problemas forem mais complexos, eu leria o material acima.

Mukesh :

você precisa importar entradas como essa no topo do componente filho

import { Directive, Component, OnInit, Input } from '@angular/core';
Tripp Cannella
fonte
3

Encontrei este documento muito útil no site do Angular 2. Finalmente, deixei que as coisas funcionassem corretamente, enquanto as outras respostas aqui, para instalar as tipagens, falharam comigo com vários erros. (Mas ajudou a me levar na direção certa.)

Em vez de incluir es6-promessa e es6-coleções, ele inclui core-js, o que fez o truque para mim ... não há conflito com as definições de core ts do Angular2. Além disso, o documento explicou como configurar tudo isso automaticamente ao instalar o NPM e como modificar seu arquivo typings.json.

Vern Jensen
fonte
2

Angular 2 RC1 renomeou o node_modules/angular2diretório para node_modules/angular.

Se você estiver usando um gulpfile para copiar arquivos para um diretório de saída, provavelmente ainda estará node_modules/angularsentado lá, o que pode ser detectado pelo compilador e confundir o inferno.

Portanto, (com cuidado), limpe o que você tem node_modulesdas versões beta e exclua todas as datilografias antigas e execute novamente typings install.

Simon_Weaver
fonte
ou, em alternativa ... trabalhar em outras coisas para 4 meses e espera para a versão final de começar de novo a partir do zero (que é o que estou fazendo)
Simon_Weaver
2

Boa ligação, @VahidN, achei necessário

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

No meu tsconfigtambém, para parar erros de es6-shimsi mesmo

Fergus Gallagher
fonte
2

Importe a instrução abaixo no seu arquivo JS.

import 'rxjs/add/operator/map';
Shivang Gupta
fonte
Estou adiando a atualização de um projeto para a versão mais recente, adicionada import './rxjs-extensions';ao app.component.tsarquivo rxjs-extensions do tutorial angular2 (incluindo a linha sugerida) e parece que ele removeu esses erros.
James
Poderia ser mais específico. Qual arquivo JS? o compilado pelo Typescript? a Principal?
mm_ 15/05
2

A resposta aceita não fornece uma solução viável, e a maioria das outras sugere a solução alternativa "barras triplas" que não é mais viável, pois a browser.d.tsfoi removida pelos últimos RCs do Angular2 e, portanto, não está mais disponível.

Eu sugiro fortemente instalar o typingsmódulo como sugerido por algumas soluções aqui, mas não é necessário fazê-lo manualmente ou globalmente - existe uma maneira eficaz de fazer isso apenas no seu projeto e na interface do VS2015. Aqui está o que você precisa fazer:

  • adicione typingsno arquivo package.json do projeto.
  • adicione um scriptbloco no package.jsonarquivo para executar / atualizar typingsapós cada ação do NPM.
  • adicione um typings.jsonarquivo na pasta raiz do projeto contendo uma referência a core-js(em geral, melhor que es6-shimatm).

É isso aí.

Você também pode dar uma olhada neste outro tópico do SO e / ou ler esta postagem no meu blog para obter detalhes adicionais.

Darkseal
fonte
2

Eu estava recebendo esse erro depois de mesclar meu ramo de desenvolvimento ao meu ramo atual. Passei algum tempo para corrigir o problema. Como você pode ver na imagem abaixo, não há nenhum problema nos códigos.

insira a descrição da imagem aqui

Portanto, a única correção que funcionou para mim é que Reiniciando o VSCode

Sibeesh Venu
fonte
0

Agora você deve importá-los manualmente.

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)
        );
Jithesh Chandra
fonte
-3

Atualizar tsconfig.json, alterar

"target": "es5"

para

"target": "es6"
Swathi Uppu
fonte
Isso pode fazer com que sua saída JavaScript seja incompatível com navegadores mais antigos.
Tom Robinson