Open2

Typescript型定義事例集

卯月しいは卯月しいは

オブジェクトのプロパティをPick/Omitしたいとき

/**
 * オブジェクトから指定したプロパティのみを抽出したオブジェクトを返す
 * @param instance 元になるオブジェクト
 * @param pickProperties 抽出するプロパティ
 * @returns 抽出後のオブジェクト
 */
export function pickProperties<K>(
  instance: K extends object ? K : never,
  ...pickProperties: (keyof K)[]
): Pick<K, (typeof pickProperties)[number]> {
  return <Pick<K, (typeof pickProperties)[number]>>pickProperties.reduce<
    Partial<K>
  >((i, p) => {
    if (p in instance) i[p] = instance[p];
    return i;
  }, {});
}

/**
 * オブジェクトから指定したプロパティを削除したオブジェクトを返す
 * @param instance 元になるオブジェクト
 * @param omitProperties 削除するプロパティ
 * @returns 削除後のオブジェクト
 */
export function omitProperties<K>(
  instance: K extends object ? K : never,
  ...omitProperties: (keyof K)[]
): Omit<K, (typeof omitProperties)[number]> {
  return <Omit<K, (typeof omitProperties)[number]>>omitProperties.reduce<
    Partial<K>
  >(
    (i, p) => {
      delete i[p];
      return i;
    },
    Object.assign({}, instance)
  );
}

https://zenn.dev/april418/articles/34007597f6ae27