typescript / expert
Snippet
Typ-Ebene Ganzzahl-Arithmetik und Bereichskonstruktion mittels Tupellängen
TypeScript unterstützt keine direkten mathematischen Operatoren auf Number-Literal-Typen. Dieses Muster simuliert Ganzzahl-Arithmetik zur Kompilierzeit durch den Aufbau rekursiver Array-Tupel und nutzt die Tupel-Längen-Eigenschaft ('length') zusammen mit Mengen-Ausschluss (Exclude), um typsichere numerische Bereichs-Unions zu erstellen.
snippet.ts
typescript
1
2
3
4
type BuildTuple<L extends number, T extends any[] = []> = T['length'] extends L ? T : BuildTuple<L, [...T, unknown]>;type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;type PortRange = IntRange<8000, 8005>;
Erklärung
1
type BuildTuple<L extends number, T extends any[] = []> = T['length'] extends L ? T : BuildTuple<L, [...T, unknown]>;
Akkumuliert rekursiv Elemente in einem Tupel, bis dessen Länge der geforderten Zahl L entspricht.
2
type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
Erzeugt eine Zahlen-Union von 0 bis N-1 durch Indizierung der akkumulierten Tupel-Elemente.
3
type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
Schließt Zahlen unterhalb der Untergrenze F aus der oberen Aufzählung T aus, um einen geschlossenen Bereich zu erzeugen.
4
type PortRange = IntRange<8000, 8005>;
Berechnet zur Kompilierzeit den exakten Typ-Literal-Union-Wert 8000 | 8001 | 8002 | 8003 | 8004.