@ angle / material / index.d.ts 'ist kein Modul

40

Bei Angular 8 tritt beim Erstellen der App der folgende Fehler auf:

app/modules/admin-module/pages/editor/editor.component.ts:6:27 - error TS2306: 
File ...node_modules/@angular/material/index.d.ts' is not a module.
ForestG
quelle

Antworten:

87

Nach dem Upgrade auf Angular 9 (heute veröffentlicht) bin ich ebenfalls auf dieses Problem gestoßen und habe festgestellt, dass die in der Antwort erwähnte Änderung vorgenommen wurde . Ich kann keinen Grund finden, warum sie diese Änderung vorgenommen haben.

Ich habe eine material.module.ts-Datei, in die ich alle Materialkomponenten importiere / exportiere (nicht die effizienteste, aber nützlich für eine schnelle Entwicklung). Ich habe alle meine Importe in die einzelnen Materialordner aktualisiert, obwohl ein index.ts-Fass möglicherweise besser ist. Ich bin mir wieder nicht sicher, warum sie diese Änderung vorgenommen haben, aber ich vermute, dass dies mit der Effizienz des Baumschüttelns zu tun hat.

Einschließlich meiner material.module.ts unten, falls es jemandem hilft, ist es von anderen Materialmodulen inspiriert, die ich gefunden habe:

HINWEIS : Seien Sie vorsichtig, wenn Sie ein freigegebenes Modul wie das folgende verwenden. Ich habe 5 ~ verschiedene Funktionsmodule (faul geladen) in meiner App, in die ich mein Materialmodul importiert habe. Aus Neugier habe ich die Verwendung des gemeinsam genutzten Moduls eingestellt und stattdessen nur die einzelnen Materialkomponenten importiert, die jedes Feature-Modul benötigt. Dies hat meine Bundle-Größe ziemlich reduziert, fast 200 KB. Ich ging davon aus, dass der Build-Optimierungsprozess alle Komponenten, die nicht von meinen Modulen verwendet werden, ordnungsgemäß löschen würde, aber dies scheint nicht der Fall zu sein ...

// material.module.ts
import { ModuleWithProviders, NgModule} from "@angular/core";
import { MAT_LABEL_GLOBAL_OPTIONS, MatNativeDateModule, MAT_DATE_LOCALE } from '@angular/material/core';
import { MatIconRegistry } from '@angular/material/icon';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatBadgeModule } from '@angular/material/badge';
import { MatButtonModule } from '@angular/material/button';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatChipsModule } from '@angular/material/chips';
import { MatStepperModule } from '@angular/material/stepper';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule } from '@angular/material/dialog';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatRadioModule } from '@angular/material/radio';
import { MatRippleModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatSliderModule } from '@angular/material/slider';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatSortModule } from '@angular/material/sort';
import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatTreeModule } from '@angular/material/tree';

@NgModule({
    imports: [
        MatAutocompleteModule,
        MatBadgeModule,
        MatButtonModule,
        MatButtonToggleModule,
        MatCardModule,
        MatCheckboxModule,
        MatChipsModule,
        MatStepperModule,
        MatDatepickerModule,
        MatDialogModule,
        MatExpansionModule,
        MatFormFieldModule,
        MatGridListModule,
        MatIconModule,
        MatInputModule,
        MatListModule,
        MatMenuModule,
        MatPaginatorModule,
        MatProgressBarModule,
        MatProgressSpinnerModule,
        MatRadioModule,
        MatRippleModule,
        MatSelectModule,
        MatSidenavModule,
        MatSliderModule,
        MatSlideToggleModule,
        MatSnackBarModule,
        MatSortModule,
        MatTableModule,
        MatTabsModule,
        MatToolbarModule,
        MatTooltipModule,
        MatTreeModule,
        MatNativeDateModule
    ],
    exports: [
        MatAutocompleteModule,
        MatBadgeModule,
        MatButtonModule,
        MatButtonToggleModule,
        MatCardModule,
        MatCheckboxModule,
        MatChipsModule,
        MatStepperModule,
        MatDatepickerModule,
        MatDialogModule,
        MatExpansionModule,
        MatFormFieldModule,
        MatGridListModule,
        MatIconModule,
        MatInputModule,
        MatListModule,
        MatMenuModule,
        MatPaginatorModule,
        MatProgressBarModule,
        MatProgressSpinnerModule,
        MatRadioModule,
        MatRippleModule,
        MatSelectModule,
        MatSidenavModule,
        MatSliderModule,
        MatSlideToggleModule,
        MatSnackBarModule,
        MatSortModule,
        MatTableModule,
        MatTabsModule,
        MatToolbarModule,
        MatTooltipModule,
        MatTreeModule,
        MatNativeDateModule
    ],
    providers: [     
    ]
})
export class MaterialModule {
    constructor(public matIconRegistry: MatIconRegistry) {
        // matIconRegistry.registerFontClassAlias('fontawesome', 'fa');
    }

    static forRoot(): ModuleWithProviders {
        return {
            ngModule: MaterialModule,
            providers: [MatIconRegistry]
        };
    }
}

Jeff Gilliland
quelle
1
Gleich hier danke für das Update
Jimmy Kane
2
Ich hatte das gleiche Problem nach dem Upgrade von Winkel 8 auf 9. Ihre Lösung hat bei mir funktioniert. Diese Antwort sollte meiner Meinung nach akzeptiert werden, da sie tatsächlich eine Lösung für die aktualisierte Version bietet. Ein Downgrade der Version 9 auf 8 aufgrund dieser Fehler sollte nicht als akzeptierte Lösung für das Problem angesehen werden. Danke für das Teilen!
Omostan
1
Die folgenden stammen alle aus Material / Kern, nicht aus Winkel / Kern (ich denke): import {MAT_LABEL_GLOBAL_OPTIONS, MatNativeDateModule, MAT_DATE_LOCALE} aus '@ eckig / Material / Kern';
SwissCoder
1
Guter Fang, in meiner Eile hatte ich MatNativeDateModule in den falschen Import gesetzt :), behoben in der Antwort
Jeff Gilliland
1
@ MikeGledhill wie viele Dinge in der Entwicklung, viele Dinge sind esoterisch. Sie sollten eine Lösung implementieren, die eine Verfallswarnung oder eine spezifischere Fehlermeldung ausgibt, damit Sie wissen, wie Sie das Problem beheben können. Die einzige andere Möglichkeit, dies zu beheben, besteht darin, Erfahrung mit Typescript & Angular zu haben und das wahrscheinliche Problem zu kennen, wenn ein Fehler mit dem Dateityp ".d.ts" auftritt. Dieses Wissen kommt normalerweise aus stundenlanger Frustration ... es muss einen besseren Weg geben, dieses "Domänenwissen" mit anderen zu teilen!
Jeff Gilliland
37

Scheint so, als ob dieser Thread besagt, dass eine brechende Änderung ausgegeben wurde:

Komponenten können nicht mehr über "@ angle / material" importiert werden. Verwenden Sie die einzelnen sekundären Einstiegspunkte, z. B. @ angle / material / button.

Update : kann bestätigen, dass dies das Problem war. Nach dem Downgrade @angular/[email protected]...auf @angular/[email protected]konnten wir dies vorübergehend lösen. Ich denke, wir müssen das Projekt aktualisieren, um eine langfristige Lösung zu finden.

ForestG
quelle
1
Nach dem Downgrade ng update @angular/materialwerden alle Importe für Sie migriert und aktualisiert :)
Nicolas
24

Dies kann gelöst werden, indem Sie den vollständigen Pfad schreiben, z. B. wenn Sie Folgendes einschließen möchten MatDialogModule:

Vor @ eckig / material 9.xx.

import { MatDialogModule } from "@angular/material";
//leading to error mentioned

Gemäß @ Winkel / Material 9.xx.

import { MatDialogModule } from "@angular/material/dialog";
//works fine 

Offizielle Referenz zum Änderungsprotokoll: https://github.com/angular/components/blob/master/CHANGELOG.md#material-9

Khushi Raval
quelle
Dieser hat für mich gearbeitet.
Shinoy Shaji
Hat auch für mich gearbeitet. Danke.
Sidhartha Shankar
8

Komponenten können nicht weiter (aus Winkel 9) über das allgemeine Verzeichnis importiert werden

Sie sollten einen angegebenen Komponentenpfad wie hinzufügen

import {} from '@angular/material'; 

import {} from '@angular/material/input';

Ali Ashraf
quelle
5
import { MatDialogModule } from '@angular/material/dialog';
import { MatTableModule } from '@angular/material/table';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button';
Владимир
quelle
Welcome @ Владимир on StackOverflow, Es wäre sehr hilfreich zum Lesen, wenn Sie Sprachcode mit `` `(ohne Leerzeichen, dh` `` Javascript) hinzufügen und schließen. Weitere Hilfe erhalten Sie unter stackoverflow.com/help/how-to-answer. Vielen Dank. Tragen Sie weiter bei
Rajan
Hallo! Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Brian
Dieser Code ist sehr schön, aber es wäre schöner, wenn Sie ihn erklären. Otdelna, Ya ne Smog Paniat.
Dr. MAF
2

Außerdem ng update @angular/materialwird Ihr Code aktualisiert und alle Importe korrigiert

Sivuyile TG Magutywa
quelle
Dadurch werden nur package.json und package-lock.json aktualisiert. Wird nichts an unserem Code ändern
Joel K Thomas
1
Gerade von 7 auf 9 aktualisiert, hat es meine Importe tatsächlich korrigiert.
Tobias Stangl
Du hast meinen Tag gerettet, danke !!!
Nicolas
0

Akzeptierte Antwort ist korrekt, hat aber bei mir nicht vollständig funktioniert. Ich musste die Datei package.lock löschen, "npm install" erneut ausführen und dann mein Visual Studio schließen und erneut öffnen. Hoffe das hilft jemandem

Feargal Kavanagh
quelle
0

Aktualisieren Sie einfach @ angle / material von 7 auf 9 ,

npm uninstall @ angle / material --save

npm install @ angle / material @ ^ 7.1.0 --save

ng update @ angle / material

Warten Sie ab und sehen Sie, wie Angular die Migration alleine durchführt.

Hoffe es hilft jemandem :)

Nicolas
quelle
-5

Tun Sie npm i -g @angular/material --save, um das Problem zu lösen

Narendra Sagadevan
quelle
Erwägen