Recursive generic depth=20
Recursive generic instantiation and cache behavior under deep type expansion.
tsz is 6.6x faster 39 lines 1 KB
Timing
Files
// Recursive generic type instantiation stress test
// Pushes MAX_INSTANTIATION_DEPTH and subtype checking limits
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
type DeepReadonly<T> = T extends object ? { readonly [P in keyof T]: DeepReadonly<T[P]> } : T;
type Wrap0<T> = { layer0: T };
type Wrap1<T> = { layer1: T };
type Wrap2<T> = { layer2: T };
type Wrap3<T> = { layer3: T };
type Wrap4<T> = { layer4: T };
type Wrap5<T> = { layer5: T };
type Wrap6<T> = { layer6: T };
type Wrap7<T> = { layer7: T };
type Wrap8<T> = { layer8: T };
type Wrap9<T> = { layer9: T };
type Wrap10<T> = { layer10: T };
type Wrap11<T> = { layer11: T };
type Wrap12<T> = { layer12: T };
type Wrap13<T> = { layer13: T };
type Wrap14<T> = { layer14: T };
type Wrap15<T> = { layer15: T };
type Wrap16<T> = { layer16: T };
type Wrap17<T> = { layer17: T };
type Wrap18<T> = { layer18: T };
type Wrap19<T> = { layer19: T };
// Deep instantiation chain
type DeepWrapped = Wrap0<Wrap1<Wrap2<Wrap3<Wrap4<Wrap5<Wrap6<Wrap7<Wrap8<Wrap9<Wrap10<Wrap11<Wrap12<Wrap13<Wrap14<Wrap15<Wrap16<Wrap17<Wrap18<Wrap19<string>>>>>>>>>>>>>>>>>>>>;
declare const deep: DeepWrapped;
declare function extract<T>(x: Wrap0<T>): T;
const _test = extract(deep);
// Recursive list operations
declare const list: LinkedList<number>;
declare function mapList<T, U>(l: LinkedList<T>, f: (x: T) => U): LinkedList<U>;
const mapped = mapList(list, x => x.toString());