Teniendo en cuenta la ValueProviderinterfaz:
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 providepropiedad es de tipo any. Eso significa que cualquier objeto (incluido el Windowconstructor) puede ir dentro de él. El objeto en realidad no importa, solo la referencia importa para identificar qué proveedor debe usarse para inyectar un parámetro en un constructor.
No debe considerarse una buena práctica utilizar el Windowconstructor nativo como token de inyección. Falla en tiempo de compilación porque Windowexiste en tiempo de ejecución en un entorno de navegador, también existe como TypeScript declarepero el compilador Angular 8 no puede hacer análisis de código estático para correlacionar los parámetros Windowen los proveedores y Windowen los parámetros de un constructor, ya que la asignación de Windowse realiza por el navegador, no por el código. Sin embargo, no estoy seguro de por qué funciona en Angular 9 ...
Debe crear su propio token de inyección que represente al proveedor de dependencia. Esta ficha de inyección debe ser:
- Una cadena dedicada (como hiciste con
'Window')
- Un dedicado
InjectionToken. Por ejemploexport const window = new InjectionToken<Window>('window');
Además, el código angular debe ser independiente de la plataforma (debe ser ejecutable en un navegador y también en un servidor Node.js), por lo que sería mejor usar una fábrica que devuelva windowo undefined/ null, luego manejar el caso undefined/ nullen los componentes.