Considerando a 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;
}
A provide
propriedade é do tipo any
. Isso significa que qualquer objeto (incluindo o Window
construtor) pode entrar nele. O objeto realmente não importa, apenas a referência importa para identificar qual provedor deve ser usado para injetar um parâmetro em um construtor.
Não deve ser considerado uma boa prática usar o Window
construtor nativo como um token de injeção. Ele falha no tempo de compilação porque Window
existe no tempo de execução em um ambiente de navegador, também existe como um TypeScript, declare
mas o compilador Angular 8 não pode fazer análise de código estático para correlacionar os parâmetros Window
nos provedores e Window
nos construtores, uma vez que a atribuição de Window
é feita pelo navegador, não pelo código. Não sei por que funciona no Angular 9, no entanto ...
Você deve criar seu próprio token de injeção que representa o provedor de dependência. Esse token de injeção deve ser:
- Uma string dedicada (como você fez com
'Window'
)
- Um dedicado
InjectionToken
. Por exemploexport const window = new InjectionToken<Window>('window');
Além disso, o código angular deve ser independente de plataforma (deve ser executável em um navegador e também em um servidor Node.js.), portanto, seria melhor usar uma fábrica que retorne window
ou undefined
/ e null
, em seguida, manipule o undefined
/ null
case nos componentes.