🐡

[TypeScript]オブジェクトのユニオン型で各オブジェクトのプロパティが異なるときに特定のプロパティのみを除外する型をつくる方法

2023/11/16に公開

TypeScriptでオブジェクトのユニオン型で各オブジェクトのプロパティが異なるときに特定のプロパティのみを除外する型をつくる方法

type ExampleTypeA = {
  type: "A";
  a: string;
  common: Date;
};

type ExampleTypeB = {
  type: "B";
  b: number;
  common: Date;
};

type Example = ExampleTypeA | ExampleTypeB;

// {type: "A" | "B"} になる
type ExampleOmit = Omit<Example, "common">

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

// Omit<ExampleTypeA, "common"> | Omit<ExampleTypeB, "common"> になる
// つまり {type: "A"; a: string} | {type: "B"; b: number;} になる
type ExampleOmitFromUnion = OmitFromUnion<Example, "common">;

参考
https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys

Discussion