Complete worked example
typescript
type Event = { kind: "roleSaved"; payload: { roleId: string } } | { kind: "companyFollowed"; payload: { companyId: string } };
type Handlers = { roleSaved: (payload: {roleId:string}) => void; companyFollowed: (payload: {companyId:string}) => void };
function dispatch(event: Event, handlers: Handlers): void {
if(event.kind === "roleSaved") handlers.roleSaved(event.payload);
else handlers.companyFollowed(event.payload);
}- Reasoning
- The tagged record and matching handler branch preserve the payload relationship without assertions.