Nie można znaleźć nazwy „wymaga” po aktualizacji do Angular4

120

Chcę używać Chart.js w moim projekcie Angular. W poprzednich wersjach Angular2 robiłem to dobrze, używając 'chart.loader.ts', który ma:

export const { Chart } = require('chart.js');

Następnie w kodzie komponentu po prostu

import { Chart } from './chart.loader';

Ale po aktualizacji do cli 1.0.0 i Angular 4 pojawia się błąd: „Nie można znaleźć nazwy 'wymaga'”.

Aby odtworzyć błąd:

ng new newapp
cd newapp
npm install chart.js --save
echo "export const { Chart } = require('chart.js');" >> src/app/chart.loader.ts
ng serve

W moim „tsconfig.json” mam

"typeRoots": [
  "node_modules/@types"
],

A w „node_modules/@types/node/index.d.ts” znajduje się:

declare var require: NodeRequire;

Więc jestem zdezorientowany.

BTW, ciągle napotykam ostrzeżenie:

[tslint] The selector of the component "OverviewComponent" should have prefix "app"(component-selector)

Chociaż ustawiłem "przedrostek": "" w moim '.angular-cli.json'. Czy to możliwe, ponieważ zmiana z „angular-cli.json” na „.angular-cli.json” była przyczyną?

Thomas Wang
źródło
Problem tkwi w pliku tsconfig.json. Zobacz rozwiązanie tutaj: stackoverflow.com/questions/31173738/…
IndyWill
@IndyWill Dzięki, właściwie powinno być w src / tsconfig.app.json. Czy możesz to napisać jako odpowiedź?
Thomas Wang,
Dla elektronów + kątowych 2/4 patrz: stackoverflow.com/a/47364843/5248229
mihaa123

Odpowiedzi:

232

Problem (jak opisano w skrypcie podczas pobierania błędu TS2304: nie można znaleźć nazwy „wymaga” ) polega na tym, że definicje typów węzła nie są zainstalowane.

W przypadku przewidywanego generowania with @angular/cli 1.x, konkretne kroki powinny być:

Krok 1 :

Zainstaluj za @types/nodepomocą jednej z następujących opcji:

- npm install --save @types/node
- yarn add @types/node -D

Krok 2 : Edytuj swój plik src / tsconfig.app.json i dodaj następujący plik w miejsce pustego "types": [], które powinno już tam być:

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...

Jeśli coś przegapiłem, zanotuj komentarz, a zmienię odpowiedź.

IndyWill
źródło
11
dobrze mi nie zadziałało… czy muszę instalować coś innego?
1
U mnie też to nie działa. Szczegóły tutaj: stackoverflow.com/questions/44421367/types-not-found
user3471528
49
Uwaga: musisz zmienić tsconfig.app.jsonw srcdodawaniu folderu "types": ["node"], nie ma go w katalogu głównym tsconfig
BrunoLM
11
Dla mnie też nie działało. inna odpowiedź sugerująca samo dodanie declare var require: any;pomogła zaskakująco.
Paritosh
Pominąłem krok 2. Dzięki !!
Robbie Smith
25

Wreszcie znalazłem rozwiązanie tego problemu, sprawdź plik modułu aplikacji:

import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MaterialModule } from '@angular/material';
import 'hammerjs';
import { ChartModule } from 'angular2-highcharts';
import * as highcharts from 'highcharts';
import { HighchartsStatic } from 'angular2-highcharts/dist/HighchartsService';

import { AppRouting } from './app.routing';
import { AppComponent } from './app.component';

declare var require: any;


export function highchartsFactory() {
      const hc = require('highcharts');
      const dd = require('highcharts/modules/drilldown');
      dd(hc);

      return hc;
}

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AppRouting,
    BrowserAnimationsModule,
    MaterialModule,
    ChartModule
  ],
  providers: [{
      provide: HighchartsStatic,
      useFactory: highchartsFactory
    }],
  bootstrap: [AppComponent]
})
export class AppModule { }

Zauważ declare var require: any;w powyższym kodzie.

GsMalhotra
źródło
1
Miałem ten problem w pliku polyfills.ts, ale Twoja „deklaracja var require: any”; naprawione. dzięki
Andre
18

Będzie działać w Angular 7+


Miałem ten sam problem, dodawałem

"types": ["node"]

do tsconfig.json folderu głównego.

Był jeszcze jeden tsconfig.app.json pod src folderu i mam rozwiązać ten dodając

"types": ["node"]

do pliku tsconfig.app.json podcompilerOptions

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": ["node"]  ----------------------< added node to the array
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}
Sunil Garg
źródło
14

Jak dla mnie, używając VSCode i Angular 5, musiałem tylko dodać „węzeł” do typów w tsconfig.app.json. Zapisz i zrestartuj serwer.

{
    "compilerOptions": {
    ..
    "types": [
      "node"
    ]
  }
  ..
}

Ciekawostką jest to, że ten problem „nie może znaleźć wymagania (”), nie występuje podczas uruchamiania za pomocą ts-node

Val Martinez
źródło
1
Zadziałało dla mnie jak urok w Angular 6.
Pic Mickael
To rozwiązanie zadziałało dla mnie w bibliotece Angular 6. Musiałem dodać "types": [ "node" ],do tsconfig.lib.jsonchociaż.
Gus
I PONOWNIE URUCHOM SERWER. Mój Boże, tak było przez cały czas. Praca nad Angular 9. 👍
Anders8
13

Nadal nie jestem pewien odpowiedzi, ale możliwe obejście to

import * as Chart from 'chart.js';
Thomas Wang
źródło
3

dodałem

"types": [ 
   "node"
]

w moim pliku tsconfig i wygląda jak działa dla mnie plik tsconfig.json

  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es2015",
    "types": [ 
      "node",
      "underscore"
    ]
  },  
Nizam Khan
źródło
Chociaż ten kod może odpowiedzieć na pytanie, nadal możesz rozważyć dodanie kilku zdań wyjaśniających, ponieważ zwiększa to wartość Twojej odpowiedzi dla innych użytkowników.
MBT
1

Dodaj następujący wiersz u góry pliku, który powoduje błąd:

declare var require: any
Vardan Nadkarni
źródło
0

Przeniosłem tsconfig.jsonplik do nowego folderu, aby zrestrukturyzować mój projekt.

Więc nie był w stanie rozwiązać ścieżki do folderu node_modules / @ types wewnątrz typeRoots właściwości tsconfig.json

Po prostu zaktualizuj ścieżkę z

"typeRoots": [
  "../node_modules/@types"
]

do

"typeRoots": [
  "../../node_modules/@types"
]

Aby tylko upewnić się, że ścieżka do node_modules została rozwiązana z nowej lokalizacji tsconfig.json

Mahesh
źródło