200 union members
Union construction, reduction, and assignability checks.
tsz is 1.8x faster 491 lines 24 KB
Timing
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';
}