0 Tage Serie
javascript / expert
Snippet

Typsichere Dependency-Injection-Tokens mit Factory-Providern

Ein `InjectionToken<T>` trägt seinen Typparameter vollständig durch `inject()` hindurch, sodass `useFeatureFlags()` ein voll typisiertes `FeatureFlags`-Objekt zurückgibt, ohne dass in der Kette irgendwo gecastet werden muss. Die Option `factory` lässt das Token selbst einen Standardwert liefern, falls sonst niemand einen bereitstellt, und weil diese Factory selbst `inject(RAW_CONFIG, { optional: true })` aufruft, kann das Token von einem weiteren optionalen Token abhängen, ohne jeden Konsumenten zu zwingen, beide zu konfigurieren. Dieses Muster — ein typisiertes Token, dessen Factory weitere optionale Tokens komponiert — ersetzt das klassische Konstruktor-Boilerplate mit `@Optional() @Inject(TOKEN)` durch einen einzigen Deklarationspunkt, der unter Strict Mode typsicher bleibt.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { InjectionToken, inject } from '@angular/core';
interface FeatureFlags {
readonly darkMode: boolean;
readonly betaCheckout: boolean;
}
const RAW_CONFIG = new InjectionToken<Partial<FeatureFlags>>('RAW_CONFIG');
const FEATURE_FLAGS = new InjectionToken<FeatureFlags>('FEATURE_FLAGS', {
providedIn: 'root',
factory: () => {
const raw = inject(RAW_CONFIG, { optional: true });
return {
darkMode: raw?.darkMode ?? false,
betaCheckout: raw?.betaCheckout ?? false,
};
},
});
function useFeatureFlags(): FeatureFlags {
return inject(FEATURE_FLAGS);
}
angular
Erklärung
1
const FEATURE_FLAGS = new InjectionToken<FeatureFlags>('FEATURE_FLAGS', { ... })
Der generische Parameter bindet den Typ des Tokens für jeden zukünftigen `inject(FEATURE_FLAGS)`-Aufruf an `FeatureFlags`.
2
factory: () => { const raw = inject(RAW_CONFIG, { optional: true }); ... }
Läuft innerhalb eines Injection-Kontexts und kann daher selbst `inject()` aufrufen, um Werte aus anderen Tokens zu komponieren, statt Standardwerte hart zu kodieren.
3
raw?.darkMode ?? false
Nullish Coalescing liefert nur dann einen konkreten Standardwert, wenn `RAW_CONFIG` nie bereitgestellt wurde, und hält so die Felder des zurückgegebenen Objekts nicht-optional.
4
function useFeatureFlags(): FeatureFlags { return inject(FEATURE_FLAGS); }
Ein typisierter Injection-Wrapper, nutzbar in jedem Injection-Kontext (Konstruktoren, Feld-Initialisierer, `provideAppInitializer`), gibt `FeatureFlags` ohne Cast zurück.