💭

[TypeScript]ユニオンの型定義で各オブジェクトのプロパティが異なるときのテクニック

2022/12/31に公開

ユニオンの型定義で各オブジェクトのプロパティが異なるときに他のオブジェクトに存在するが、それぞれのオブジェクトで使われていないプロパティをオプショナルにして値の型をundefinedにする方法です。

type hoge = {a: string} | {b: number};
type hogeWithUndefined = WithUndefined<hoge>
// {a: string; b?: undefined;} | {a?: undefined; b: number;}
type WithUndefined<U> = W<U, U>;
type W<U1, U2> = U1 extends U1
  ? Omit<
      {
        [K in U2 extends U2
          ? keyof U2 extends string
            ? keyof U2
            : never
          : never]?: undefined;
      },
      keyof U1
    > &
      U1
  : never;

下記の対応を簡単にするテクニックです。
https://blog.uhy.ooo/entry/2020-08-18/ts-union-prop/

Discussion