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...
コメント