Могу только один совет дать по работает с ошибками. Много где в примерах создают кастомную ошибку через extends от Error. Я в итоге так намучался.
Допустим ты ловишь ошибку из mysql или ещё какой либы. А там она кастомная и чтобы не потерять её поля, тебе надо прямо в свою кастомную все поля засетить. А когда тебе не хочется знать какие там поля, а просто потом залогировать все подробности.
По итогу Discriminated unions ложатся лучше всего
{
type: 'SomeError' as const,
err: Error (здесь ошибка из catch или своя)
}
Т. е. здесь нет шага, когды ты оригинальную ошибку перетираешь своей.
По итогу в left у тебя отлично типизированные ошибки.