b9eeb74f37
* Implement tail-recursion for conditional types and lower general instantiation depth limit to 100 * Add tests * Skip caching for tail recursive temporary conditional types
50 lines
2.9 KiB
TypeScript
50 lines
2.9 KiB
TypeScript
//// [tailRecursiveConditionalTypes.ts]
|
|
type Trim<S extends string> =
|
|
S extends ` ${infer T}` ? Trim<T> :
|
|
S extends `${infer T} ` ? Trim<T> :
|
|
S;
|
|
|
|
type T10 = Trim<' hello '>;
|
|
type T11 = Trim<' hello '>;
|
|
|
|
type GetChars<S> = GetCharsRec<S, never>;
|
|
type GetCharsRec<S, Acc> =
|
|
S extends `${infer Char}${infer Rest}` ? GetCharsRec<Rest, Char | Acc> : Acc;
|
|
|
|
type T20 = GetChars<'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'>;
|
|
|
|
type Reverse<T> = any[] extends T ? T : ReverseRec<T, []>;
|
|
type ReverseRec<T, Acc extends unknown[]> =
|
|
T extends [infer Head, ...infer Tail] ? ReverseRec<Tail, [Head, ...Acc]> : Acc;
|
|
|
|
type T30 = Reverse<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>;
|
|
type T31 = Reverse<string[]>;
|
|
|
|
type TupleOf<T, N extends number> = number extends N ? T[] : TupleOfRec<T, N, []>;
|
|
type TupleOfRec<T, N extends number, Acc extends unknown[]> =
|
|
Acc["length"] extends N ? Acc : TupleOfRec<T, N, [T, ...Acc]>;
|
|
|
|
type T40 = TupleOf<any, 200>;
|
|
type T41 = TupleOf<any, number>;
|
|
|
|
|
|
//// [tailRecursiveConditionalTypes.js]
|
|
"use strict";
|
|
|
|
|
|
//// [tailRecursiveConditionalTypes.d.ts]
|
|
declare type Trim<S extends string> = S extends ` ${infer T}` ? Trim<T> : S extends `${infer T} ` ? Trim<T> : S;
|
|
declare type T10 = Trim<' hello '>;
|
|
declare type T11 = Trim<' hello '>;
|
|
declare type GetChars<S> = GetCharsRec<S, never>;
|
|
declare type GetCharsRec<S, Acc> = S extends `${infer Char}${infer Rest}` ? GetCharsRec<Rest, Char | Acc> : Acc;
|
|
declare type T20 = GetChars<'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'>;
|
|
declare type Reverse<T> = any[] extends T ? T : ReverseRec<T, []>;
|
|
declare type ReverseRec<T, Acc extends unknown[]> = T extends [infer Head, ...infer Tail] ? ReverseRec<Tail, [Head, ...Acc]> : Acc;
|
|
declare type T30 = Reverse<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>;
|
|
declare type T31 = Reverse<string[]>;
|
|
declare type TupleOf<T, N extends number> = number extends N ? T[] : TupleOfRec<T, N, []>;
|
|
declare type TupleOfRec<T, N extends number, Acc extends unknown[]> = Acc["length"] extends N ? Acc : TupleOfRec<T, N, [T, ...Acc]>;
|
|
declare type T40 = TupleOf<any, 200>;
|
|
declare type T41 = TupleOf<any, number>;
|