typescript / expert
Snippet
Nominale Abhängigkeitsregister-Typisierung für gemockte Unittest-Umgebungen
Mappen von Typen in Kombination mit Typinferenz (`infer`) verwandelt konkrete Service-Schnittstellen in vollständig typisierte Test-Mocks, während nominales Branding (`unique symbol`) Verwechslungen durch rein strukturelle Typisierung verhindert.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare const mockBrand: unique symbol;type MockedService<T> = {[K in keyof T]: T[K] extends (...args: infer A) => infer R? { (...args: A): R; mockCalls: A[] }: T[K];} & { readonly [mockBrand]: unique symbol };type RegistrySchema = {logger: { log(msg: string): void };database: { query(sql: string): unknown[] };};type MockContainer<T> = {[K in keyof T]: MockedService<T[K]>;};
Erklärung
1
declare const mockBrand: unique symbol;
Deklariert ein eindeutiges Symbol zur Erstellung eines nominalen Brands für Test-Mock-Objekte.
2
[K in keyof T]: T[K] extends (...args: infer A) => infer R
Iteriert über Eigenschaften und analysiert Funktionssignaturen zur Extraktion von Argumenten und Rückgabewerten.
3
? { (...args: A): R; mockCalls: A[] }
Erweitert Funktionstypen um ein typisiertes Array zur Erfassung bisheriger Aufrufargumente.
4
} & { readonly [mockBrand]: unique symbol };
Verknüpft das Objekt mit einem nominalen Brand-Token, um die Zuweisung regulärer Objekte zu unterbinden.