Teniendo en cuenta la ValueProvider
interfaz:
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
propiedad es de tipo any
. Eso significa que cualquier objeto (incluido el Window
constructor) 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 Window
constructor nativo como token de inyección. Falla en tiempo de compilación porque Window
existe en tiempo de ejecución en un entorno de navegador, también existe como TypeScript declare
pero el compilador Angular 8 no puede hacer análisis de código estático para correlacionar los parámetros Window
en los proveedores y Window
en los parámetros de un constructor, ya que la asignación de Window
se 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 window
o undefined
/ null
, luego manejar el caso undefined
/ null
en los componentes.