Mapped type keys=450

Mapped-type and property traversal behavior in the solver.

tsz is 3.7x faster 481 lines 10 KB

Timing

tsz
131.79ms
tsgo
493.18ms

Files

// Mapped type expansion stress test
// Tests MAX_MAPPED_KEYS limit and mapped type evaluation

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] };

// Advanced mapped types
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;
    prop300: string;
    prop301: string;
    prop302: string;
    prop303: string;
    prop304: string;
    prop305: string;
    prop306: string;
    prop307: string;
    prop308: string;
    prop309: string;
    prop310: string;
    prop311: string;
    prop312: string;
    prop313: string;
    prop314: string;
    prop315: string;
    prop316: string;
    prop317: string;
    prop318: string;
    prop319: string;
    prop320: string;
    prop321: string;
    prop322: string;
    prop323: string;
    prop324: string;
    prop325: string;
    prop326: string;
    prop327: string;
    prop328: string;
    prop329: string;
    prop330: string;
    prop331: string;
    prop332: string;
    prop333: string;
    prop334: string;
    prop335: string;
    prop336: string;
    prop337: string;
    prop338: string;
    prop339: string;
    prop340: string;
    prop341: string;
    prop342: string;
    prop343: string;
    prop344: string;
    prop345: string;
    prop346: string;
    prop347: string;
    prop348: string;
    prop349: string;
    prop350: string;
    prop351: string;
    prop352: string;
    prop353: string;
    prop354: string;
    prop355: string;
    prop356: string;
    prop357: string;
    prop358: string;
    prop359: string;
    prop360: string;
    prop361: string;
    prop362: string;
    prop363: string;
    prop364: string;
    prop365: string;
    prop366: string;
    prop367: string;
    prop368: string;
    prop369: string;
    prop370: string;
    prop371: string;
    prop372: string;
    prop373: string;
    prop374: string;
    prop375: string;
    prop376: string;
    prop377: string;
    prop378: string;
    prop379: string;
    prop380: string;
    prop381: string;
    prop382: string;
    prop383: string;
    prop384: string;
    prop385: string;
    prop386: string;
    prop387: string;
    prop388: string;
    prop389: string;
    prop390: string;
    prop391: string;
    prop392: string;
    prop393: string;
    prop394: string;
    prop395: string;
    prop396: string;
    prop397: string;
    prop398: string;
    prop399: string;
    prop400: string;
    prop401: string;
    prop402: string;
    prop403: string;
    prop404: string;
    prop405: string;
    prop406: string;
    prop407: string;
    prop408: string;
    prop409: string;
    prop410: string;
    prop411: string;
    prop412: string;
    prop413: string;
    prop414: string;
    prop415: string;
    prop416: string;
    prop417: string;
    prop418: string;
    prop419: string;
    prop420: string;
    prop421: string;
    prop422: string;
    prop423: string;
    prop424: string;
    prop425: string;
    prop426: string;
    prop427: string;
    prop428: string;
    prop429: string;
    prop430: string;
    prop431: string;
    prop432: string;
    prop433: string;
    prop434: string;
    prop435: string;
    prop436: string;
    prop437: string;
    prop438: string;
    prop439: string;
    prop440: string;
    prop441: string;
    prop442: string;
    prop443: string;
    prop444: string;
    prop445: string;
    prop446: string;
    prop447: string;
    prop448: string;
    prop449: string;
}

// Mapped type transformations
type Partial1 = MyOptional<BigObject>;
type Readonly1 = MyReadonly<BigObject>;
type Both = MyReadonly<MyOptional<BigObject>>;

type BigGetters = Getters<BigObject>;
type BigSetters = Setters<BigObject>;

// Nested mapped type
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;