For context, I'm using Error as my "defect" channel and tagged types as my "error" channel.
At the moment, creating just the async version of it was enough for me, but you could create a sync matchTag and matchAllTags and then also rename these to matchTagAsync and matchAllTagsAsync.
There is also another caveat: both functions don't accept handlers that return tagged errors. For my use case, which is handling all possible errors before unwrapping a ResultAsync<T, Error>, I didn't need to handle that scenario.
Example usage:
function getUserDetails(req: Request): ResultAsync<User, NoTokenError | ExpiredTokenError | Error>;