Union型に対してOmitする時(typescript)

JavaScript

Union型に対してOmitした場合、

type A = { omit: string; a: string }
type B = { omit: string; a: string; b: string }
type U = A | B
type O = Omit<U, "omit">

この時のtype Oは { a: string }と推論されます。

これ直感とは異なっていて、私なら以下のように推論されてほしいです。

type U = {  a: string } | { a: string; b: string }

こう言う時はdistributeさせてユニオンを個別にOmitさせればOKです。
anyがNGならunknownに変えるか、keyof anyをPropertyKeyに変えましょう。

type DistributiveOmit<T, K extends keyof any> = T extends any
  ? Omit<T, K>
  : never

参考

Typescript: Omit a property from all interfaces in a union, but keep the union structure
I'mnewtotypescriptandIhaveafewinterfacesdefinedlikeso:interfaceA{toRemove:string;key1:"this1";key2:number;}interfaceB{toRemove:string;key1:"this2";key3:s...

コメント