Encyclopédie des erreurs

Jeton d'injection invalide

Cette erreur survient lorsqu'Angular ne peut pas résoudre une dépendance d'une classe pendant l'injection de dépendances. Elle concerne le plus souvent les classes qui utilisent l'injection par constructeur, où Angular s'appuie sur les métadonnées TypeScript pour déterminer les types des paramètres.

Les causes les plus courantes sont :

  1. Une classe de service n'a pas le décorateur @Service() ou @Injectable
  2. Un InjectionToken n'a pas de définition de provider adéquate
  3. Un paramètre de constructeur ne peut pas être résolu

Note : La fonction inject() prend un jeton explicite, donc le scénario du « paramètre impossible à résoudre » ne s'applique pas directement à elle. Cependant, si la classe injectée n'a elle-même pas @Service() et possède ses propres dépendances de constructeur, l'erreur peut quand même survenir.

Scénarios courants

Décorateur @Service() manquant

Lorsqu'une classe a des dépendances de constructeur mais n'a pas le décorateur @Service(), Angular ne peut pas résoudre ses paramètres :

Missing @Service() decorator

export class UserClient {
  constructor(private http: HttpClient) {} // Angular can't resolve this
}

Ajoutez le décorateur @Service() pour corriger cela :

@Service()
export class UserClient {
  constructor(private http: HttpClient) {}
}

Paramètres de constructeur impossibles à résoudre

Cette erreur apparaît aussi lorsqu'Angular ne peut pas déterminer le type d'un paramètre de constructeur :

@Service()
export class DataStore {
  // Angular can't resolve 'config' without a provider
  constructor(private config: AppConfig) {}
}

Assurez-vous que tous les paramètres de constructeur ont des providers configurés ou utilisent @Optional() pour les dépendances optionnelles.

Déboguer l'erreur

Le message d'erreur précise quel jeton n'a pas pu être résolu :

  • Can't resolve all parameters for X: (?, ?, ?) — Les marques ? indiquent les paramètres impossibles à résoudre. Vérifiez que la classe a @Service ou @Injectable() et que toutes les dépendances ont des providers.
  • Token X is missing a ɵprov definition — Un InjectionToken a été utilisé sans configurer de provider. Enregistrez le jeton avec une valeur à l'aide de {provide: TOKEN, useValue: ...} ou ajoutez une fabrique par défaut à la définition du jeton.

Remontez la stack trace de l'erreur pour identifier où se produit l'injection problématique, puis vérifiez que :

  1. La classe a un décorateur @Service ou @Injectable()
  2. Tous les paramètres de constructeur ont des providers enregistrés
  3. Tout InjectionToken a un provider configuré ou une valeur par défaut