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

tsz
155.99ms
tsgo
491.28ms

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;