🏗

特定の型からRequireとOptionalを指定してPickする

2021/10/04に公開

一つの大きな型を用途ごとに使いまわしたい時などにあると便利と思い書きました。
Required<Pick<Hoge, 'xxx'>> & Partial<Pick<Hoge, 'yyy'>> のような書き方の方がぱっと見何してるかはわかりやすい気もしますが、RequiredとPartialで重複したときにコンパイラでは気がつけないので、一つにまとめておいた方が良いかなと。

TKGは趣味です。

interface Hoge {
  A: string;
  B: string;
  C: string;
  D: string;
  E: string;
}

/**
 * Objectから、Required, Optionalをそれぞれ指定した型を作る
 *
 * - T: 元の型
 * - K: 必須にしたい項目をUnionで定義
 * - G: 任意にしたい項目をUnionで定義
 *
 * ## 注意
 *
 * - K(必須), G(任意)の値の重複は許されない (コンパイラが怒ってくれる)
 * - KでもGでも指定されなかったキーは型に入らない
 */
export type PickPartial<T, K extends keyof T, G extends Exclude<keyof T, K>> = Required<Pick<T, K>> &
  Partial<Pick<T, G>>;

const hoge: PickPartial<Hoge, 'A' | 'B', 'D' | 'E'> = {
  // A: string
  // B: string
  // D?: string
  // E?: string
};

Discussion

ログインするとコメントできます