200 union members

tsz is 1.4x faster 491 lines 24 KB

Timing

tsz
611.84ms
tsgo
840.16ms

Files

// Union type stress test - discriminated unions with many members

type StressEvent =
  | { type: "event0"; payload0: string; timestamp: number }
  | { type: "event1"; payload1: string; timestamp: number }
  | { type: "event2"; payload2: string; timestamp: number }
  | { type: "event3"; payload3: string; timestamp: number }
  | { type: "event4"; payload4: string; timestamp: number }
  | { type: "event5"; payload5: string; timestamp: number }
  | { type: "event6"; payload6: string; timestamp: number }
  | { type: "event7"; payload7: string; timestamp: number }
  | { type: "event8"; payload8: string; timestamp: number }
  | { type: "event9"; payload9: string; timestamp: number }
  | { type: "event10"; payload10: string; timestamp: number }
  | { type: "event11"; payload11: string; timestamp: number }
  | { type: "event12"; payload12: string; timestamp: number }
  | { type: "event13"; payload13: string; timestamp: number }
  | { type: "event14"; payload14: string; timestamp: number }
  | { type: "event15"; payload15: string; timestamp: number }
  | { type: "event16"; payload16: string; timestamp: number }
  | { type: "event17"; payload17: string; timestamp: number }
  | { type: "event18"; payload18: string; timestamp: number }
  | { type: "event19"; payload19: string; timestamp: number }
  | { type: "event20"; payload20: string; timestamp: number }
  | { type: "event21"; payload21: string; timestamp: number }
  | { type: "event22"; payload22: string; timestamp: number }
  | { type: "event23"; payload23: string; timestamp: number }
  | { type: "event24"; payload24: string; timestamp: number }
  | { type: "event25"; payload25: string; timestamp: number }
  | { type: "event26"; payload26: string; timestamp: number }
  | { type: "event27"; payload27: string; timestamp: number }
  | { type: "event28"; payload28: string; timestamp: number }
  | { type: "event29"; payload29: string; timestamp: number }
  | { type: "event30"; payload30: string; timestamp: number }
  | { type: "event31"; payload31: string; timestamp: number }
  | { type: "event32"; payload32: string; timestamp: number }
  | { type: "event33"; payload33: string; timestamp: number }
  | { type: "event34"; payload34: string; timestamp: number }
  | { type: "event35"; payload35: string; timestamp: number }
  | { type: "event36"; payload36: string; timestamp: number }
  | { type: "event37"; payload37: string; timestamp: number }
  | { type: "event38"; payload38: string; timestamp: number }
  | { type: "event39"; payload39: string; timestamp: number }
  | { type: "event40"; payload40: string; timestamp: number }
  | { type: "event41"; payload41: string; timestamp: number }
  | { type: "event42"; payload42: string; timestamp: number }
  | { type: "event43"; payload43: string; timestamp: number }
  | { type: "event44"; payload44: string; timestamp: number }
  | { type: "event45"; payload45: string; timestamp: number }
  | { type: "event46"; payload46: string; timestamp: number }
  | { type: "event47"; payload47: string; timestamp: number }
  | { type: "event48"; payload48: string; timestamp: number }
  | { type: "event49"; payload49: string; timestamp: number }
  | { type: "event50"; payload50: string; timestamp: number }
  | { type: "event51"; payload51: string; timestamp: number }
  | { type: "event52"; payload52: string; timestamp: number }
  | { type: "event53"; payload53: string; timestamp: number }
  | { type: "event54"; payload54: string; timestamp: number }
  | { type: "event55"; payload55: string; timestamp: number }
  | { type: "event56"; payload56: string; timestamp: number }
  | { type: "event57"; payload57: string; timestamp: number }
  | { type: "event58"; payload58: string; timestamp: number }
  | { type: "event59"; payload59: string; timestamp: number }
  | { type: "event60"; payload60: string; timestamp: number }
  | { type: "event61"; payload61: string; timestamp: number }
  | { type: "event62"; payload62: string; timestamp: number }
  | { type: "event63"; payload63: string; timestamp: number }
  | { type: "event64"; payload64: string; timestamp: number }
  | { type: "event65"; payload65: string; timestamp: number }
  | { type: "event66"; payload66: string; timestamp: number }
  | { type: "event67"; payload67: string; timestamp: number }
  | { type: "event68"; payload68: string; timestamp: number }
  | { type: "event69"; payload69: string; timestamp: number }
  | { type: "event70"; payload70: string; timestamp: number }
  | { type: "event71"; payload71: string; timestamp: number }
  | { type: "event72"; payload72: string; timestamp: number }
  | { type: "event73"; payload73: string; timestamp: number }
  | { type: "event74"; payload74: string; timestamp: number }
  | { type: "event75"; payload75: string; timestamp: number }
  | { type: "event76"; payload76: string; timestamp: number }
  | { type: "event77"; payload77: string; timestamp: number }
  | { type: "event78"; payload78: string; timestamp: number }
  | { type: "event79"; payload79: string; timestamp: number }
  | { type: "event80"; payload80: string; timestamp: number }
  | { type: "event81"; payload81: string; timestamp: number }
  | { type: "event82"; payload82: string; timestamp: number }
  | { type: "event83"; payload83: string; timestamp: number }
  | { type: "event84"; payload84: string; timestamp: number }
  | { type: "event85"; payload85: string; timestamp: number }
  | { type: "event86"; payload86: string; timestamp: number }
  | { type: "event87"; payload87: string; timestamp: number }
  | { type: "event88"; payload88: string; timestamp: number }
  | { type: "event89"; payload89: string; timestamp: number }
  | { type: "event90"; payload90: string; timestamp: number }
  | { type: "event91"; payload91: string; timestamp: number }
  | { type: "event92"; payload92: string; timestamp: number }
  | { type: "event93"; payload93: string; timestamp: number }
  | { type: "event94"; payload94: string; timestamp: number }
  | { type: "event95"; payload95: string; timestamp: number }
  | { type: "event96"; payload96: string; timestamp: number }
  | { type: "event97"; payload97: string; timestamp: number }
  | { type: "event98"; payload98: string; timestamp: number }
  | { type: "event99"; payload99: string; timestamp: number }
  | { type: "event100"; payload100: string; timestamp: number }
  | { type: "event101"; payload101: string; timestamp: number }
  | { type: "event102"; payload102: string; timestamp: number }
  | { type: "event103"; payload103: string; timestamp: number }
  | { type: "event104"; payload104: string; timestamp: number }
  | { type: "event105"; payload105: string; timestamp: number }
  | { type: "event106"; payload106: string; timestamp: number }
  | { type: "event107"; payload107: string; timestamp: number }
  | { type: "event108"; payload108: string; timestamp: number }
  | { type: "event109"; payload109: string; timestamp: number }
  | { type: "event110"; payload110: string; timestamp: number }
  | { type: "event111"; payload111: string; timestamp: number }
  | { type: "event112"; payload112: string; timestamp: number }
  | { type: "event113"; payload113: string; timestamp: number }
  | { type: "event114"; payload114: string; timestamp: number }
  | { type: "event115"; payload115: string; timestamp: number }
  | { type: "event116"; payload116: string; timestamp: number }
  | { type: "event117"; payload117: string; timestamp: number }
  | { type: "event118"; payload118: string; timestamp: number }
  | { type: "event119"; payload119: string; timestamp: number }
  | { type: "event120"; payload120: string; timestamp: number }
  | { type: "event121"; payload121: string; timestamp: number }
  | { type: "event122"; payload122: string; timestamp: number }
  | { type: "event123"; payload123: string; timestamp: number }
  | { type: "event124"; payload124: string; timestamp: number }
  | { type: "event125"; payload125: string; timestamp: number }
  | { type: "event126"; payload126: string; timestamp: number }
  | { type: "event127"; payload127: string; timestamp: number }
  | { type: "event128"; payload128: string; timestamp: number }
  | { type: "event129"; payload129: string; timestamp: number }
  | { type: "event130"; payload130: string; timestamp: number }
  | { type: "event131"; payload131: string; timestamp: number }
  | { type: "event132"; payload132: string; timestamp: number }
  | { type: "event133"; payload133: string; timestamp: number }
  | { type: "event134"; payload134: string; timestamp: number }
  | { type: "event135"; payload135: string; timestamp: number }
  | { type: "event136"; payload136: string; timestamp: number }
  | { type: "event137"; payload137: string; timestamp: number }
  | { type: "event138"; payload138: string; timestamp: number }
  | { type: "event139"; payload139: string; timestamp: number }
  | { type: "event140"; payload140: string; timestamp: number }
  | { type: "event141"; payload141: string; timestamp: number }
  | { type: "event142"; payload142: string; timestamp: number }
  | { type: "event143"; payload143: string; timestamp: number }
  | { type: "event144"; payload144: string; timestamp: number }
  | { type: "event145"; payload145: string; timestamp: number }
  | { type: "event146"; payload146: string; timestamp: number }
  | { type: "event147"; payload147: string; timestamp: number }
  | { type: "event148"; payload148: string; timestamp: number }
  | { type: "event149"; payload149: string; timestamp: number }
  | { type: "event150"; payload150: string; timestamp: number }
  | { type: "event151"; payload151: string; timestamp: number }
  | { type: "event152"; payload152: string; timestamp: number }
  | { type: "event153"; payload153: string; timestamp: number }
  | { type: "event154"; payload154: string; timestamp: number }
  | { type: "event155"; payload155: string; timestamp: number }
  | { type: "event156"; payload156: string; timestamp: number }
  | { type: "event157"; payload157: string; timestamp: number }
  | { type: "event158"; payload158: string; timestamp: number }
  | { type: "event159"; payload159: string; timestamp: number }
  | { type: "event160"; payload160: string; timestamp: number }
  | { type: "event161"; payload161: string; timestamp: number }
  | { type: "event162"; payload162: string; timestamp: number }
  | { type: "event163"; payload163: string; timestamp: number }
  | { type: "event164"; payload164: string; timestamp: number }
  | { type: "event165"; payload165: string; timestamp: number }
  | { type: "event166"; payload166: string; timestamp: number }
  | { type: "event167"; payload167: string; timestamp: number }
  | { type: "event168"; payload168: string; timestamp: number }
  | { type: "event169"; payload169: string; timestamp: number }
  | { type: "event170"; payload170: string; timestamp: number }
  | { type: "event171"; payload171: string; timestamp: number }
  | { type: "event172"; payload172: string; timestamp: number }
  | { type: "event173"; payload173: string; timestamp: number }
  | { type: "event174"; payload174: string; timestamp: number }
  | { type: "event175"; payload175: string; timestamp: number }
  | { type: "event176"; payload176: string; timestamp: number }
  | { type: "event177"; payload177: string; timestamp: number }
  | { type: "event178"; payload178: string; timestamp: number }
  | { type: "event179"; payload179: string; timestamp: number }
  | { type: "event180"; payload180: string; timestamp: number }
  | { type: "event181"; payload181: string; timestamp: number }
  | { type: "event182"; payload182: string; timestamp: number }
  | { type: "event183"; payload183: string; timestamp: number }
  | { type: "event184"; payload184: string; timestamp: number }
  | { type: "event185"; payload185: string; timestamp: number }
  | { type: "event186"; payload186: string; timestamp: number }
  | { type: "event187"; payload187: string; timestamp: number }
  | { type: "event188"; payload188: string; timestamp: number }
  | { type: "event189"; payload189: string; timestamp: number }
  | { type: "event190"; payload190: string; timestamp: number }
  | { type: "event191"; payload191: string; timestamp: number }
  | { type: "event192"; payload192: string; timestamp: number }
  | { type: "event193"; payload193: string; timestamp: number }
  | { type: "event194"; payload194: string; timestamp: number }
  | { type: "event195"; payload195: string; timestamp: number }
  | { type: "event196"; payload196: string; timestamp: number }
  | { type: "event197"; payload197: string; timestamp: number }
  | { type: "event198"; payload198: string; timestamp: number }
  | { type: "event199"; payload199: string; timestamp: number };

function handleEvent(event: StressEvent): string {
  switch (event.type) {
    case "event0": return event.payload0;
    case "event1": return event.payload1;
    case "event2": return event.payload2;
    case "event3": return event.payload3;
    case "event4": return event.payload4;
    case "event5": return event.payload5;
    case "event6": return event.payload6;
    case "event7": return event.payload7;
    case "event8": return event.payload8;
    case "event9": return event.payload9;
    case "event10": return event.payload10;
    case "event11": return event.payload11;
    case "event12": return event.payload12;
    case "event13": return event.payload13;
    case "event14": return event.payload14;
    case "event15": return event.payload15;
    case "event16": return event.payload16;
    case "event17": return event.payload17;
    case "event18": return event.payload18;
    case "event19": return event.payload19;
    case "event20": return event.payload20;
    case "event21": return event.payload21;
    case "event22": return event.payload22;
    case "event23": return event.payload23;
    case "event24": return event.payload24;
    case "event25": return event.payload25;
    case "event26": return event.payload26;
    case "event27": return event.payload27;
    case "event28": return event.payload28;
    case "event29": return event.payload29;
    case "event30": return event.payload30;
    case "event31": return event.payload31;
    case "event32": return event.payload32;
    case "event33": return event.payload33;
    case "event34": return event.payload34;
    case "event35": return event.payload35;
    case "event36": return event.payload36;
    case "event37": return event.payload37;
    case "event38": return event.payload38;
    case "event39": return event.payload39;
    case "event40": return event.payload40;
    case "event41": return event.payload41;
    case "event42": return event.payload42;
    case "event43": return event.payload43;
    case "event44": return event.payload44;
    case "event45": return event.payload45;
    case "event46": return event.payload46;
    case "event47": return event.payload47;
    case "event48": return event.payload48;
    case "event49": return event.payload49;
    case "event50": return event.payload50;
    case "event51": return event.payload51;
    case "event52": return event.payload52;
    case "event53": return event.payload53;
    case "event54": return event.payload54;
    case "event55": return event.payload55;
    case "event56": return event.payload56;
    case "event57": return event.payload57;
    case "event58": return event.payload58;
    case "event59": return event.payload59;
    case "event60": return event.payload60;
    case "event61": return event.payload61;
    case "event62": return event.payload62;
    case "event63": return event.payload63;
    case "event64": return event.payload64;
    case "event65": return event.payload65;
    case "event66": return event.payload66;
    case "event67": return event.payload67;
    case "event68": return event.payload68;
    case "event69": return event.payload69;
    case "event70": return event.payload70;
    case "event71": return event.payload71;
    case "event72": return event.payload72;
    case "event73": return event.payload73;
    case "event74": return event.payload74;
    case "event75": return event.payload75;
    case "event76": return event.payload76;
    case "event77": return event.payload77;
    case "event78": return event.payload78;
    case "event79": return event.payload79;
    case "event80": return event.payload80;
    case "event81": return event.payload81;
    case "event82": return event.payload82;
    case "event83": return event.payload83;
    case "event84": return event.payload84;
    case "event85": return event.payload85;
    case "event86": return event.payload86;
    case "event87": return event.payload87;
    case "event88": return event.payload88;
    case "event89": return event.payload89;
    case "event90": return event.payload90;
    case "event91": return event.payload91;
    case "event92": return event.payload92;
    case "event93": return event.payload93;
    case "event94": return event.payload94;
    case "event95": return event.payload95;
    case "event96": return event.payload96;
    case "event97": return event.payload97;
    case "event98": return event.payload98;
    case "event99": return event.payload99;
    case "event100": return event.payload100;
    case "event101": return event.payload101;
    case "event102": return event.payload102;
    case "event103": return event.payload103;
    case "event104": return event.payload104;
    case "event105": return event.payload105;
    case "event106": return event.payload106;
    case "event107": return event.payload107;
    case "event108": return event.payload108;
    case "event109": return event.payload109;
    case "event110": return event.payload110;
    case "event111": return event.payload111;
    case "event112": return event.payload112;
    case "event113": return event.payload113;
    case "event114": return event.payload114;
    case "event115": return event.payload115;
    case "event116": return event.payload116;
    case "event117": return event.payload117;
    case "event118": return event.payload118;
    case "event119": return event.payload119;
    case "event120": return event.payload120;
    case "event121": return event.payload121;
    case "event122": return event.payload122;
    case "event123": return event.payload123;
    case "event124": return event.payload124;
    case "event125": return event.payload125;
    case "event126": return event.payload126;
    case "event127": return event.payload127;
    case "event128": return event.payload128;
    case "event129": return event.payload129;
    case "event130": return event.payload130;
    case "event131": return event.payload131;
    case "event132": return event.payload132;
    case "event133": return event.payload133;
    case "event134": return event.payload134;
    case "event135": return event.payload135;
    case "event136": return event.payload136;
    case "event137": return event.payload137;
    case "event138": return event.payload138;
    case "event139": return event.payload139;
    case "event140": return event.payload140;
    case "event141": return event.payload141;
    case "event142": return event.payload142;
    case "event143": return event.payload143;
    case "event144": return event.payload144;
    case "event145": return event.payload145;
    case "event146": return event.payload146;
    case "event147": return event.payload147;
    case "event148": return event.payload148;
    case "event149": return event.payload149;
    case "event150": return event.payload150;
    case "event151": return event.payload151;
    case "event152": return event.payload152;
    case "event153": return event.payload153;
    case "event154": return event.payload154;
    case "event155": return event.payload155;
    case "event156": return event.payload156;
    case "event157": return event.payload157;
    case "event158": return event.payload158;
    case "event159": return event.payload159;
    case "event160": return event.payload160;
    case "event161": return event.payload161;
    case "event162": return event.payload162;
    case "event163": return event.payload163;
    case "event164": return event.payload164;
    case "event165": return event.payload165;
    case "event166": return event.payload166;
    case "event167": return event.payload167;
    case "event168": return event.payload168;
    case "event169": return event.payload169;
    case "event170": return event.payload170;
    case "event171": return event.payload171;
    case "event172": return event.payload172;
    case "event173": return event.payload173;
    case "event174": return event.payload174;
    case "event175": return event.payload175;
    case "event176": return event.payload176;
    case "event177": return event.payload177;
    case "event178": return event.payload178;
    case "event179": return event.payload179;
    case "event180": return event.payload180;
    case "event181": return event.payload181;
    case "event182": return event.payload182;
    case "event183": return event.payload183;
    case "event184": return event.payload184;
    case "event185": return event.payload185;
    case "event186": return event.payload186;
    case "event187": return event.payload187;
    case "event188": return event.payload188;
    case "event189": return event.payload189;
    case "event190": return event.payload190;
    case "event191": return event.payload191;
    case "event192": return event.payload192;
    case "event193": return event.payload193;
    case "event194": return event.payload194;
    case "event195": return event.payload195;
    case "event196": return event.payload196;
    case "event197": return event.payload197;
    case "event198": return event.payload198;
    case "event199": return event.payload199;
    default: throw new Error("unreachable");
  }
}

function isEvent0(e: StressEvent): e is Extract<StressEvent, { type: "event0" }> {
  return e.type === "event0";
}

function isEvent10(e: StressEvent): e is Extract<StressEvent, { type: "event10" }> {
  return e.type === "event10";
}

function isEvent20(e: StressEvent): e is Extract<StressEvent, { type: "event20" }> {
  return e.type === "event20";
}

function isEvent30(e: StressEvent): e is Extract<StressEvent, { type: "event30" }> {
  return e.type === "event30";
}

function isEvent40(e: StressEvent): e is Extract<StressEvent, { type: "event40" }> {
  return e.type === "event40";
}

function isEvent50(e: StressEvent): e is Extract<StressEvent, { type: "event50" }> {
  return e.type === "event50";
}

function isEvent60(e: StressEvent): e is Extract<StressEvent, { type: "event60" }> {
  return e.type === "event60";
}

function isEvent70(e: StressEvent): e is Extract<StressEvent, { type: "event70" }> {
  return e.type === "event70";
}

function isEvent80(e: StressEvent): e is Extract<StressEvent, { type: "event80" }> {
  return e.type === "event80";
}

function isEvent90(e: StressEvent): e is Extract<StressEvent, { type: "event90" }> {
  return e.type === "event90";
}

function isEvent100(e: StressEvent): e is Extract<StressEvent, { type: "event100" }> {
  return e.type === "event100";
}

function isEvent110(e: StressEvent): e is Extract<StressEvent, { type: "event110" }> {
  return e.type === "event110";
}

function isEvent120(e: StressEvent): e is Extract<StressEvent, { type: "event120" }> {
  return e.type === "event120";
}

function isEvent130(e: StressEvent): e is Extract<StressEvent, { type: "event130" }> {
  return e.type === "event130";
}

function isEvent140(e: StressEvent): e is Extract<StressEvent, { type: "event140" }> {
  return e.type === "event140";
}

function isEvent150(e: StressEvent): e is Extract<StressEvent, { type: "event150" }> {
  return e.type === "event150";
}

function isEvent160(e: StressEvent): e is Extract<StressEvent, { type: "event160" }> {
  return e.type === "event160";
}

function isEvent170(e: StressEvent): e is Extract<StressEvent, { type: "event170" }> {
  return e.type === "event170";
}

function isEvent180(e: StressEvent): e is Extract<StressEvent, { type: "event180" }> {
  return e.type === "event180";
}

function isEvent190(e: StressEvent): e is Extract<StressEvent, { type: "event190" }> {
  return e.type === "event190";
}