50 union members
Union construction, reduction, and assignability checks.
tsz is 6.7x faster 131 lines 6 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 };
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;
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';
}