Typeservicesv0.6.0
PrivateIntRange
The actual implementation of IntRangeIntRange. It's private because it has some arguments that don't need to be exposed.
type PrivateIntRange<Start extends number, End extends number, Step extends number, Gap extends number = Subtract<Step, 1>, List extends unknown[] = TupleOf<Start, never>, EndLengthTuple extends unknown[] = TupleOf<End>> = Gap extends 0 // Handle the case that without `Step` ? List['length'] extends End // The result of "List[length] === End" ? Exclude<List[number], never> // All unused elements are `never`, so exclude them : PrivateIntRange<Start, End, Step, Gap, [...List, List['length']]> // Handle the case that with `Step` : List extends [...(infer U), ...EndLengthTuple] // The result of "List[length] >= End", because the `...TupleOf<Gap, never>` maybe make `List` too long. ? Exclude<List[number], never> : PrivateIntRange<Start, End, Step, Gap, [...List, List['length'], ...TupleOf<Gap, never>]>type PrivateIntRange<Start extends number, End extends number, Step extends number, Gap extends number = Subtract<Step, 1>, List extends unknown[] = TupleOf<Start, never>, EndLengthTuple extends unknown[] = TupleOf<End>> = Gap extends 0 // Handle the case that without `Step` ? List['length'] extends End // The result of "List[length] === End" ? Exclude<List[number], never> // All unused elements are `never`, so exclude them : PrivateIntRange<Start, End, Step, Gap, [...List, List['length']]> // Handle the case that with `Step` : List extends [...(infer U), ...EndLengthTuple] // The result of "List[length] >= End", because the `...TupleOf<Gap, never>` maybe make `List` too long. ? Exclude<List[number], never> : PrivateIntRange<Start, End, Step, Gap, [...List, List['length'], ...TupleOf<Gap, never>]>