Omit doesn't distribute so it selects shared keys from all of your input types and then omits the requested keys - but that first step creates a new flattened (sort of) type (that's why it seems to work in the simple case)
but also... if ur types would contain Animal and Dog that would reduce to just Animal (cause Dog is a subtype of Animal and redundant subtypes are eliminated in this situation). So it might not be exactly what u want either, YMMV
Comments
https://www.typescriptlang.org/play/?#code/MYewdgzgLgBCBGArGBeGBvAUDGBDAXBjAGYgiECMMAvgDTYzyHolmEDMN9OwzjuAJ0IAiYV0zUA3JkxQAngAcApjACiADygDcwKEoAmAFUUq0ACnnKQxOEgCUAbQDWSudZiWl7hIgC60zxgAJSUIAFcAG1g0AHkAWwBLKAAeDS0dPSMTWhgwJQA3JQEAPmkAejKcGAA9AH5MIA