Biorąc pod uwagę ValueProviderinterfejs:
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;
}
provideNieruchomość jest typu any. Oznacza to, że dowolny obiekt (włącznie z Windowkonstruktorem) może wejść do niego. Obiekt w rzeczywistości nie ma znaczenia, tylko odniesienia mają znaczenie w celu ustalenia, który dostawca powinien zostać użyty do wstrzyknięcia parametru do konstruktora.
Nie należy uważać za dobrą praktykę używania natywnego Windowkonstruktora jako tokena wstrzykiwania. Nie powiedzie się w czasie kompilacji, ponieważ Windowistnieje w czasie wykonywania w środowisku przeglądarki, istnieje również jako TypeScript, declareale kompilator Angular 8 nie może przeprowadzić analizy kodu statycznego w celu skorelowania Windowparametrów dostawców i Windowkonstruktora, ponieważ przypisanie Windowjest wykonane przez przeglądarkę, a nie przez kod. Nie jestem pewien, dlaczego działa w Angular 9, chociaż ...
Należy utworzyć własny token wstrzykiwania, który reprezentuje dostawcę zależności. Ten token wtrysku powinien być:
- Dedykowany ciąg (jak to zrobiłeś
'Window')
- Dedykowany
InjectionToken. Na przykładexport const window = new InjectionToken<Window>('window');
Ponadto kod Angular powinien być niezależny od platformy (powinien być wykonywalny w przeglądarce i na serwerze Node.js), więc lepiej byłoby użyć fabryki, która zwraca windowlub undefined/ null, a następnie obsługiwać undefined/ nullcase w komponentach.