Mapped complex template keys=200

tsz is 1.3x faster 252 lines 7 KB

Timing

tsz
396.00ms
tsgo
525.12ms

Files

// Mapped Type Complex Template Expansion O(N^2) stress test

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 | 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]> };
type FormField<T> = T extends string ? { type: "text"; value: T } : T extends number ? { type: "number"; value: T } : T extends boolean ? { type: "checkbox"; value: T } : T extends (infer U)[] ? { type: "list"; items: FormField<U>[] } : T extends object ? { type: "group"; fields: FormFields<T> } : { 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 };
}

type BigForm = FormFields<BigModel>;
type BigStringified = Stringify<BigModel>;
type BigValidated = Validate<BigModel>;
type Chained3 = FormFields<Nullable<BigModel>>;
declare const form: BigForm;
const _fLast = form.field199;