Mapped complex template keys=200
No-emit type-check timing for mapped complex template keys=200.
tsz is 3.1x faster 252 lines 7 KB
Timing
Files
// Mapped Type Complex Template Expansion O(N²) stress test
// Targets: evaluate_rules/mapped.rs — N properties × expensive template evaluation
//
// Unlike simple homomorphic mapped types ({ [K in keyof T]: T[K] }) where the
// template is trivial, these use conditional types and nested mapped types in
// the template position, making each property evaluation expensive.
// Utility types with non-trivial evaluation
type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
type Stringify<T> = { [K in keyof T]: T[K] extends number ? string : T[K] extends boolean ? 'true' | 'false' : T[K] extends string ? T[K] : string };
type Validate<T> = { [K in keyof T]: T[K] extends string ? { valid: true; value: T[K] } : T[K] extends number ? { valid: true; value: T[K] } : { valid: false; value: never } };
type Nullable<T> = { [K in keyof T]: T[K] | null | undefined };
type Promisify<T> = { [K in keyof T]: Promise<T[K]> };
// Complex conditional template: each property evaluation triggers conditional
// type distribution and nested type instantiation
type FormField<T> =
T extends string ? { type: 'text'; value: T; validate: (v: string) => boolean }
: T extends number ? { type: 'number'; value: T; validate: (v: number) => boolean }
: T extends boolean ? { type: 'checkbox'; value: T; validate: (v: boolean) => boolean }
: T extends (infer U)[] ? { type: 'list'; items: FormField<U>[]; validate: (v: U[]) => boolean }
: T extends object ? { type: 'group'; fields: FormFields<T>; validate: (v: T) => boolean }
: { type: 'unknown'; value: T };
type FormFields<T> = { [K in keyof T]: FormField<T[K]> };
interface BigModel {
field0: string;
field1: number;
field2: boolean;
field3: string[];
field4: { nested: string; count: number };
field5: string;
field6: number;
field7: boolean;
field8: string[];
field9: { nested: string; count: number };
field10: string;
field11: number;
field12: boolean;
field13: string[];
field14: { nested: string; count: number };
field15: string;
field16: number;
field17: boolean;
field18: string[];
field19: { nested: string; count: number };
field20: string;
field21: number;
field22: boolean;
field23: string[];
field24: { nested: string; count: number };
field25: string;
field26: number;
field27: boolean;
field28: string[];
field29: { nested: string; count: number };
field30: string;
field31: number;
field32: boolean;
field33: string[];
field34: { nested: string; count: number };
field35: string;
field36: number;
field37: boolean;
field38: string[];
field39: { nested: string; count: number };
field40: string;
field41: number;
field42: boolean;
field43: string[];
field44: { nested: string; count: number };
field45: string;
field46: number;
field47: boolean;
field48: string[];
field49: { nested: string; count: number };
field50: string;
field51: number;
field52: boolean;
field53: string[];
field54: { nested: string; count: number };
field55: string;
field56: number;
field57: boolean;
field58: string[];
field59: { nested: string; count: number };
field60: string;
field61: number;
field62: boolean;
field63: string[];
field64: { nested: string; count: number };
field65: string;
field66: number;
field67: boolean;
field68: string[];
field69: { nested: string; count: number };
field70: string;
field71: number;
field72: boolean;
field73: string[];
field74: { nested: string; count: number };
field75: string;
field76: number;
field77: boolean;
field78: string[];
field79: { nested: string; count: number };
field80: string;
field81: number;
field82: boolean;
field83: string[];
field84: { nested: string; count: number };
field85: string;
field86: number;
field87: boolean;
field88: string[];
field89: { nested: string; count: number };
field90: string;
field91: number;
field92: boolean;
field93: string[];
field94: { nested: string; count: number };
field95: string;
field96: number;
field97: boolean;
field98: string[];
field99: { nested: string; count: number };
field100: string;
field101: number;
field102: boolean;
field103: string[];
field104: { nested: string; count: number };
field105: string;
field106: number;
field107: boolean;
field108: string[];
field109: { nested: string; count: number };
field110: string;
field111: number;
field112: boolean;
field113: string[];
field114: { nested: string; count: number };
field115: string;
field116: number;
field117: boolean;
field118: string[];
field119: { nested: string; count: number };
field120: string;
field121: number;
field122: boolean;
field123: string[];
field124: { nested: string; count: number };
field125: string;
field126: number;
field127: boolean;
field128: string[];
field129: { nested: string; count: number };
field130: string;
field131: number;
field132: boolean;
field133: string[];
field134: { nested: string; count: number };
field135: string;
field136: number;
field137: boolean;
field138: string[];
field139: { nested: string; count: number };
field140: string;
field141: number;
field142: boolean;
field143: string[];
field144: { nested: string; count: number };
field145: string;
field146: number;
field147: boolean;
field148: string[];
field149: { nested: string; count: number };
field150: string;
field151: number;
field152: boolean;
field153: string[];
field154: { nested: string; count: number };
field155: string;
field156: number;
field157: boolean;
field158: string[];
field159: { nested: string; count: number };
field160: string;
field161: number;
field162: boolean;
field163: string[];
field164: { nested: string; count: number };
field165: string;
field166: number;
field167: boolean;
field168: string[];
field169: { nested: string; count: number };
field170: string;
field171: number;
field172: boolean;
field173: string[];
field174: { nested: string; count: number };
field175: string;
field176: number;
field177: boolean;
field178: string[];
field179: { nested: string; count: number };
field180: string;
field181: number;
field182: boolean;
field183: string[];
field184: { nested: string; count: number };
field185: string;
field186: number;
field187: boolean;
field188: string[];
field189: { nested: string; count: number };
field190: string;
field191: number;
field192: boolean;
field193: string[];
field194: { nested: string; count: number };
field195: string;
field196: number;
field197: boolean;
field198: string[];
field199: { nested: string; count: number };
}
// Each mapped type application evaluates a conditional template for 200 properties
type BigForm = FormFields<BigModel>;
type BigStringified = Stringify<BigModel>;
type BigValidated = Validate<BigModel>;
type BigNullable = Nullable<BigModel>;
type BigPromises = Promisify<BigModel>;
type BigDeepPartial = DeepPartial<BigModel>;
// Chained: each composition re-evaluates all 200 properties
type Chained1 = Nullable<Stringify<BigModel>>;
type Chained2 = Validate<Nullable<BigModel>>;
type Chained3 = FormFields<Nullable<BigModel>>;
declare const form: BigForm;
declare const stringified: BigStringified;
declare const validated: BigValidated;
declare const chained: Chained3;
const _f0 = form.field0;
const _s0 = stringified.field0;
const _v0 = validated.field0;
const _fLast = form.field199;
const _cLast = chained.field199;