100 union members
Union construction, reduction, and assignability checks.
tsz is 4.0x faster 251 lines 12 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 };
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;
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';
}