Mapped type keys=100

Mapped-type and property traversal behavior in the solver.

tsz is 6.2x faster 131 lines 2 KB

Timing

tsz
63.53ms
tsgo
393.68ms

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

// 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;