typescript intersection vs union types