@ angular / material / index.d.ts 'n'est pas un module

40

Avec Angular 8, lors de la création de l'application, nous rencontrons l'erreur suivante:

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
la source

Réponses:

87

Après la mise à niveau vers Angular 9 (publié aujourd'hui), j'ai également rencontré ce problème et j'ai constaté qu'ils avaient apporté le changement de rupture mentionné dans la réponse . Je ne trouve pas de raison pour laquelle ils ont fait ce changement.

J'ai un fichier material.module.ts que j'importe / exporte tous les composants matériels (pas le plus efficace, mais utile pour un développement rapide). J'ai parcouru et mis à jour toutes mes importations dans les dossiers de matériaux individuels, bien qu'un baril index.ts puisse être mieux. Encore une fois, je ne sais pas pourquoi ils ont fait ce changement, mais je suppose que cela a à voir avec l'efficacité de l'agitation des arbres.

Y compris mon material.module.ts ci-dessous au cas où cela aiderait quelqu'un, il est inspiré d'autres modules matériels que j'ai trouvés:

REMARQUE : Comme d'autres articles de blog l'ont mentionné et d'après mon expérience personnelle, soyez prudent lorsque vous utilisez un module partagé comme ci-dessous. J'ai 5 ~ modules de fonctionnalités différents (chargés paresseusement) dans mon application dans lesquels j'ai importé mon module de matériau. Par curiosité, j'ai cessé d'utiliser le module partagé et à la place, j'ai seulement importé les composants matériels individuels dont chaque module de fonction avait besoin. Cela a réduit ma taille de bundle un peu, presque une réduction de 200 Ko. J'ai supposé que le processus d'optimisation de construction supprimerait correctement tout composant non utilisé par mes modules, mais cela ne semble pas être le cas ...

// 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
la source
1
Même ici, merci pour la mise à jour
Jimmy Kane
2
J'ai eu le même problème après la mise à niveau de angular 8 vers 9. Votre solution a fonctionné pour moi. Cette réponse devrait être acceptée à mon avis car elle fournit en fait une solution pour la version mise à niveau. La rétrogradation de la version 9 à 8 en raison de ces erreurs ne doit pas être considérée comme la solution acceptée au problème. Merci d'avoir partagé!
omostan
1
les éléments suivants proviennent tous de matériel / noyau non angulaire / noyau (je suppose): import {MAT_LABEL_GLOBAL_OPTIONS, MatNativeDateModule, MAT_DATE_LOCALE} de '@ angular / material / core';
SwissCoder
1
Bonne capture, dans ma hâte, j'avais mis MatNativeDateModule dans la mauvaise importation :), corrigé dans la réponse
Jeff Gilliland
1
@MikeGledhill comme beaucoup de choses en développement, beaucoup de choses sont ésotériques. Ils doivent implémenter une solution qui donne un avertissement de dépréciation ou un message d'erreur plus spécifique afin que vous sachiez comment y remédier. La seule autre façon de savoir comment résoudre ce problème est si vous avez de l'expérience avec Typescript & Angular et que vous savez quel est le problème probable lorsque vous voyez une erreur avec un type de fichier ".d.ts". Cette connaissance vient généralement d'heures de frustration ... il doit y avoir une meilleure façon de partager cette "connaissance de domaine" avec les autres!
Jeff Gilliland
37

On dirait que ce fil dit qu'un changement de rupture a été émis:

Les composants ne peuvent plus être importés via "@ angular / material". Utilisez les points d'entrée secondaires individuels, tels que @ angulaire / matériau / bouton.

Mise à jour : peut confirmer, c'était le problème. Après avoir rétrogradé @angular/[email protected]...à, @angular/[email protected]nous pourrions résoudre ce problème temporairement. Je suppose que nous devons mettre à jour le projet pour une solution à long terme.

ForestG
la source
1
après avoir fait le downgrade, faites le ng update @angular/material, il va migrer et mettre à jour toutes les importations pour vous :)
Nicolas il y a
24

Cela peut être résolu en écrivant le chemin complet, par exemple si vous souhaitez inclure le MatDialogModulesuivi:

Avant @ angulaire / matériau 9.xx

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

Selon @ angulaire / matériau 9.xx

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

Référence officielle des modifications apportées au journal des modifications: https://github.com/angular/components/blob/master/CHANGELOG.md#material-9

Khushi Raval
la source
Celui-ci a fonctionné pour moi.
Shinoy Shaji
A également fonctionné pour moi .. Merci.
Sidhartha Shankar
8

Les composants ne peuvent plus être importés (depuis Angular 9) via le répertoire général

vous devez ajouter un chemin de composant spécifié comme

import {} from '@angular/material'; 

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

Ali Ashraf
la source
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';
Владимир
la source
Bienvenue @ Владимир sur StackOverflow, il serait vraiment utile de lire si vous ajoutez du code de langue avec `` `(sans espace, c'est-à-dire` `` javascript) et fermez-le. pour plus d'aide, visitez stackoverflow.com/help/how-to-answer Merci. Continuez à contribuer
Rajan
salut! Bien que ce code puisse résoudre la question, y compris une explication de comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre message, et entraînerait probablement plus de votes positifs. N'oubliez pas que vous répondrez à la question des lecteurs à l'avenir, pas seulement à la personne qui pose la question maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limitations et hypothèses applicables.
Brian
Ce code est très agréable, mais ce serait mieux si vous l'expliquez. Otdelna, Ya ne smog paniat.
Dr MAF
2

Et ng update @angular/materialmettra également à jour votre code et corrigera toutes les importations

Sivuyile TG Magutywa
la source
Cela ne mettra à jour que package.json et package-lock.json. Ne changera rien dans notre code
Joel K Thomas
1
Je viens de passer de 7 à 9, cela a corrigé mes importations, en fait.
Tobias Stangl
Vous m'avez sauvé la journée, merci !!!
Nicolas Il y a
0

La réponse acceptée est correcte, mais cela n'a pas entièrement fonctionné pour moi. J'ai dû supprimer le fichier package.lock, relancer «npm install», puis fermer et rouvrir mon studio visuel. J'espère que cela aide quelqu'un

Feargal Kavanagh
la source
0

Il suffit de mettre à jour @ angular / material de 7 à 9 ,

npm uninstall @ angular / material --save

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

ng update @ angular / material

Attendez et voyez Angular faire la migration seul,

J'espère que cela aide quelqu'un :)

Nicolas
la source
-5

Faire npm i -g @angular/material --savepour résoudre le problème

Narendra Sagadevan
la source
Pensez à ajouter plus de détails et à utiliser des codes formatés
MehrdadEP