Angular ja Typescript: Nimiä ei löydy - Virhe: nimeä ei voi löytää


Käytän Angularia (versio 2) TypeScriptin (versio 1.6) kanssa, ja kun käännän koodin, saan nämä virheet:

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

Tässä on koodi:

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

Vastaus #1

Työkierto on mainittu version 2.0.0-beta.6 (2016-02-11) muutosten lokissa (lueteltu rikkomuksia sisältävien muutosten alla):

Jos käytät --target=es5, sinun täytyy lisätä rivi jonnekin sovellukseesi (esimerkiksi .ts-tiedoston alkuun, jossa kutsut bootstrapia):

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

(Huomaa, että jos tiedostosi ei ole samassa hakemistossa kuin node_modules, sinun täytyy lisätä yksi tai useampi ../ kyseisen polun alkuun.)

Varmista, että sinulla on oikea viitepolku, minun piti lisätä ../ alkuun saadakseni tämän toimimaan.

Vastaus #2

ES6-ominaisuuksia, kuten lupauksia, ei ole määritelty kohdistettaessa ES5:een. On olemassa muita kirjastoja, mutta core-js on JavaScript-kirjasto, jota Angularin tiimi käyttää. Se sisältää polyfillit ES6:lle.

Angular 2 on muuttunut paljon siitä, kun tätä kysymystä kysyttiin. Tyyppideklaroinnit ovat paljon helpompia käyttää Typescript 2.0:ssa.

npm install -g typescript

ES6-ominaisuuksia Angular 2:ssa varten et tarvitse Typingsiä. Käytä vain TypeScript 2.0:a tai uudempaa ja asenna @types/core-js npm:llä:

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

Lisää sitten TypeRoots ja Types attribuutit tsconfig.json-tiedostoosi:

{
  "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"
  ]
}

Tämä on paljon helpompaa kuin Typingsin käyttäminen, kuten muissa vastauksissa on selitetty. Katso Microsoftin blogikirjoitus saadaksesi lisää tietoa: Typescript: The Future of Declaration Files

Vastaus #3

Tunnettu ongelma: https://github.com/angular/angular/issues/4902

Perimmäinen syy: TypeScriptin oletuksena sisällyttämä .d.ts-tiedosto vaihtelee käännöstavoitteen mukaan, joten es5-kohdetta käytettäessä tarvitaan enemmän ambient-ilmoituksia, vaikka asiat olisivatkin todellisuudessa saatavilla ajoympäristöissä (esim. Chrome). Lisätietoja lib.d.ts:stä

Vastaus #4

Niille, jotka seuraavat Angular2-opasta sivustolla angular.io, ollakseen täsmällisiä, tässä on laajennus mvdluitin vastauksesta siitä, tarkalleen missä koodi tulee sijoittaa:

Tiedostosi main.ts tulisi näyttää tältä:

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

Huomaa, että jätät /// eteenpäin osoittavat kauttaviivat, älä poista niitä.

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

Vastaus #5

Pystyin korjaamaan tämän seuraavalla komennolla

typings install es6-promise es6-collections --ambient

Huomaa, että tarvitset typings saadaksesi yllä olevan komennon toimimaan; jos sinulla ei ole sitä, suorita seuraava komento asentaaksesi sen

npm install -g typings

PÄIVITYS

typings-päivitys ei enää lue --ambient, siitä tuli --global, myös joidenkin ihmisten täytyy asentaa yllä olevien kirjastojen määritelmät, käytä vain seuraavaa komentoa

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

Kiitos @bgerth siitä, että huomautit tästä.

Vastaus #6

Kun käytössä on Typescript >= 2, tsconfig.json-tiedoston "lib"-vaihtoehto hoitaa asian. Typings ei ole tarpeen. https://www.typescriptlang.org/docs/handbook/compiler-options.html

{
    "compilerOptions": {
        "target": "es5",
        "lib": ["es2016", "dom"] //or es6 instead of es2016(es7)
    }
}

Vastaus #7

Versiolle Angular 2.0.0-rc.0 node_modules/angular2/typings/browser.d.ts lisääminen ei toimi. Lisää ensin typings.json-tiedosto ratkaisuusi seuraavalla sisällöllä:

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

Ja päivitä sitten package.json-tiedosto sisällyttämään tämä postinstall:

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

Suorita nyt npm install

Nyt sinun tulisi myös ohittaa typings-kansio tsconfig.json-tiedostossasi:

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

Päivitys

Nyt AngularJS 2.0 käyttää core-js sen sijaan, että käyttäisi es6-shim. Seuraa sen nopean aloituksen typings.json-tiedostoa saadaksesi lisää tietoa.

Vastaus #8

voit lisätä koodin .ts-tiedostojen alkuun.

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

Vastaus #9

Sain tämän Angular 2 rc1:ssä. Kävi ilmi, että joitakin nimiä muuttui typings v1:n ja vanhan 0.x:n välillä. browser.d.ts-tiedostot muuttuivat index.d.ts-tiedostoiksi.

Suorittamisen jälkeen typings install etsi käynnistystiedostosi (siinä missä käynnistät sovelluksen) ja lisää:

/// <reference path="../typings/index.d.ts" /> (tai ilman ../, jos aloitustiedostosi on samassa kansiossa kuin typings-kansio)

Tiedoston index.d.ts lisääminen tiedostojen listaan tsconfig.json-tiedostossa ei jostain syystä toiminut.

Myöskään es6-shim-pakettia ei tarvittu.

Aiheeseen liittyviä artikkeleita