Mapped complex template keys=200
tsz is 1.3x faster 252 lines 7 KB
Timing
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;