typescript / expert
Snippet
Type-Level Integer Arithmetic and Range Building using Tuple Lengths
TypeScript does not support direct mathematical operators on number literal types. This pattern simulates integer arithmetic at compile time by building recursive array tuples and using tuple property indexing ('length') alongside set exclusion (Exclude) to construct type-safe numeric range unions.
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>;
Breakdown
1
type BuildTuple<L extends number, T extends any[] = []> = T['length'] extends L ? T : BuildTuple<L, [...T, unknown]>;
Recursively accumulates elements in a tuple until its length matches the requested literal number L.
2
type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
Creates a numeric union from 0 up to N-1 by indexing the accumulated tuple elements.
3
type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
Excludes numbers below the lower bound F from the upper enumeration T to produce a closed range.
4
type PortRange = IntRange<8000, 8005>;
Computes the exact type literal union 8000 | 8001 | 8002 | 8003 | 8004 at compile time.