Considérant l' ValueProvider
interface:
export declare interface ValueProvider extends ValueSansProvider {
/**
* An injection token. Typically an instance of `Type` or `InjectionToken`, but can be `any`.
*/
provide: any;
/**
* When true, injector returns an array of instances. This is useful to allow multiple
* providers spread across many files to provide configuration information to a common token.
*/
multi?: boolean;
}
La provide
propriété est de type any
. Cela signifie que tout objet (y compris le Window
constructeur) peut y pénétrer. L'objet n'a en fait pas d'importance, seule la référence compte pour identifier le fournisseur à utiliser pour injecter un paramètre dans un constructeur.
Il ne doit pas être considéré comme une bonne pratique d'utiliser le Window
constructeur natif comme jeton d'injection. Il échoue au moment de la compilation, car il Window
existe au moment de l'exécution dans un environnement de navigateur, il existe également en tant que TypeScript, declare
mais le compilateur Angular 8 ne peut pas faire d'analyse de code statique pour corréler les paramètres Window
dans les fournisseurs et Window
dans les paramètres du constructeur, car l'affectation de Window
est effectuée par le navigateur, pas par le code. Je ne sais pas pourquoi cela fonctionne dans Angular 9, cependant ...
Vous devez créer votre propre jeton d'injection qui représente le fournisseur de dépendances. Ce jeton d'injection doit être:
- Une chaîne dédiée (comme vous l'avez fait avec
'Window'
)
- Un dédié
InjectionToken
. Par exempleexport const window = new InjectionToken<Window>('window');
De plus, le code angulaire devrait être indépendant de la plate-forme (devrait également être exécutable dans un navigateur et sur un serveur Node.js), il serait donc préférable d'utiliser une usine qui renvoie window
ou undefined
/ null
, puis de gérer le undefined
/ null
case dans les composants.