Mapped type keys=300

tsz is 1.5x faster 331 lines 7 KB

Timing

tsz
285.52ms
tsgo
433.58ms

Files

// Mapped type expansion stress test

type MyOptional<T> = { [K in keyof T]?: T[K] };
type MyRequired<T> = { [K in keyof T]-?: T[K] };
type MyReadonly<T> = { readonly [K in keyof T]: T[K] };
type MyMutable<T> = { -readonly [K in keyof T]: T[K] };
type Getters<T> = { [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K] };
type Setters<T> = { [K in keyof T as `set${Capitalize<string & K>}`]: (val: T[K]) => void };

interface BigObject {
  prop0: string;
  prop1: string;
  prop2: string;
  prop3: string;
  prop4: string;
  prop5: string;
  prop6: string;
  prop7: string;
  prop8: string;
  prop9: string;
  prop10: string;
  prop11: string;
  prop12: string;
  prop13: string;
  prop14: string;
  prop15: string;
  prop16: string;
  prop17: string;
  prop18: string;
  prop19: string;
  prop20: string;
  prop21: string;
  prop22: string;
  prop23: string;
  prop24: string;
  prop25: string;
  prop26: string;
  prop27: string;
  prop28: string;
  prop29: string;
  prop30: string;
  prop31: string;
  prop32: string;
  prop33: string;
  prop34: string;
  prop35: string;
  prop36: string;
  prop37: string;
  prop38: string;
  prop39: string;
  prop40: string;
  prop41: string;
  prop42: string;
  prop43: string;
  prop44: string;
  prop45: string;
  prop46: string;
  prop47: string;
  prop48: string;
  prop49: string;
  prop50: string;
  prop51: string;
  prop52: string;
  prop53: string;
  prop54: string;
  prop55: string;
  prop56: string;
  prop57: string;
  prop58: string;
  prop59: string;
  prop60: string;
  prop61: string;
  prop62: string;
  prop63: string;
  prop64: string;
  prop65: string;
  prop66: string;
  prop67: string;
  prop68: string;
  prop69: string;
  prop70: string;
  prop71: string;
  prop72: string;
  prop73: string;
  prop74: string;
  prop75: string;
  prop76: string;
  prop77: string;
  prop78: string;
  prop79: string;
  prop80: string;
  prop81: string;
  prop82: string;
  prop83: string;
  prop84: string;
  prop85: string;
  prop86: string;
  prop87: string;
  prop88: string;
  prop89: string;
  prop90: string;
  prop91: string;
  prop92: string;
  prop93: string;
  prop94: string;
  prop95: string;
  prop96: string;
  prop97: string;
  prop98: string;
  prop99: string;
  prop100: string;
  prop101: string;
  prop102: string;
  prop103: string;
  prop104: string;
  prop105: string;
  prop106: string;
  prop107: string;
  prop108: string;
  prop109: string;
  prop110: string;
  prop111: string;
  prop112: string;
  prop113: string;
  prop114: string;
  prop115: string;
  prop116: string;
  prop117: string;
  prop118: string;
  prop119: string;
  prop120: string;
  prop121: string;
  prop122: string;
  prop123: string;
  prop124: string;
  prop125: string;
  prop126: string;
  prop127: string;
  prop128: string;
  prop129: string;
  prop130: string;
  prop131: string;
  prop132: string;
  prop133: string;
  prop134: string;
  prop135: string;
  prop136: string;
  prop137: string;
  prop138: string;
  prop139: string;
  prop140: string;
  prop141: string;
  prop142: string;
  prop143: string;
  prop144: string;
  prop145: string;
  prop146: string;
  prop147: string;
  prop148: string;
  prop149: string;
  prop150: string;
  prop151: string;
  prop152: string;
  prop153: string;
  prop154: string;
  prop155: string;
  prop156: string;
  prop157: string;
  prop158: string;
  prop159: string;
  prop160: string;
  prop161: string;
  prop162: string;
  prop163: string;
  prop164: string;
  prop165: string;
  prop166: string;
  prop167: string;
  prop168: string;
  prop169: string;
  prop170: string;
  prop171: string;
  prop172: string;
  prop173: string;
  prop174: string;
  prop175: string;
  prop176: string;
  prop177: string;
  prop178: string;
  prop179: string;
  prop180: string;
  prop181: string;
  prop182: string;
  prop183: string;
  prop184: string;
  prop185: string;
  prop186: string;
  prop187: string;
  prop188: string;
  prop189: string;
  prop190: string;
  prop191: string;
  prop192: string;
  prop193: string;
  prop194: string;
  prop195: string;
  prop196: string;
  prop197: string;
  prop198: string;
  prop199: string;
  prop200: string;
  prop201: string;
  prop202: string;
  prop203: string;
  prop204: string;
  prop205: string;
  prop206: string;
  prop207: string;
  prop208: string;
  prop209: string;
  prop210: string;
  prop211: string;
  prop212: string;
  prop213: string;
  prop214: string;
  prop215: string;
  prop216: string;
  prop217: string;
  prop218: string;
  prop219: string;
  prop220: string;
  prop221: string;
  prop222: string;
  prop223: string;
  prop224: string;
  prop225: string;
  prop226: string;
  prop227: string;
  prop228: string;
  prop229: string;
  prop230: string;
  prop231: string;
  prop232: string;
  prop233: string;
  prop234: string;
  prop235: string;
  prop236: string;
  prop237: string;
  prop238: string;
  prop239: string;
  prop240: string;
  prop241: string;
  prop242: string;
  prop243: string;
  prop244: string;
  prop245: string;
  prop246: string;
  prop247: string;
  prop248: string;
  prop249: string;
  prop250: string;
  prop251: string;
  prop252: string;
  prop253: string;
  prop254: string;
  prop255: string;
  prop256: string;
  prop257: string;
  prop258: string;
  prop259: string;
  prop260: string;
  prop261: string;
  prop262: string;
  prop263: string;
  prop264: string;
  prop265: string;
  prop266: string;
  prop267: string;
  prop268: string;
  prop269: string;
  prop270: string;
  prop271: string;
  prop272: string;
  prop273: string;
  prop274: string;
  prop275: string;
  prop276: string;
  prop277: string;
  prop278: string;
  prop279: string;
  prop280: string;
  prop281: string;
  prop282: string;
  prop283: string;
  prop284: string;
  prop285: string;
  prop286: string;
  prop287: string;
  prop288: string;
  prop289: string;
  prop290: string;
  prop291: string;
  prop292: string;
  prop293: string;
  prop294: string;
  prop295: string;
  prop296: string;
  prop297: string;
  prop298: string;
  prop299: string;
}

type Partial1 = MyOptional<BigObject>;
type Readonly1 = MyReadonly<BigObject>;
type Both = MyReadonly<MyOptional<BigObject>>;
type BigGetters = Getters<BigObject>;
type BigSetters = Setters<BigObject>;
type DeepOptional<T> = T extends object ? { [K in keyof T]?: DeepOptional<T[K]> } : T;
type DeepBigObject = DeepOptional<BigObject>;

declare const partial: Partial1;
declare const getters: BigGetters;
declare const deep: DeepBigObject;
const _prop0 = partial.prop0;