【TypeScript】2つのオブジェクトのプロパティをマージした型を定義する

やりたいこと

type TypeA = {
a: string;
};
type TypeB = {
b: string;
};
// { a: string; b: string; } を定義したい

上記のように、2つのオブジェクト(TypeATypeB)のプロパティをマージした型を定義したい。

type TypeA = {
a: string;
};
type TypeB = {
b: string;
};
type TypeAB = typeA & typeB; // { a: string; } & { b: string; }

ちなみに上記のようにIntersection(交差)型を使用することで実現できないことはないがこれは厳密にはマージされた型ではないので、純粋にマージした型を定義したい。

解決法

type TypeA = {
a: string;
};
type TypeB = {
b: string;
};
type Merge<T> = {
[K in keyof T]: T[K];
};
type TypeAB = Merge<typeA & typeB>; // { a: string; b: string; }
  1. Mergetypeを独自に定義
    • keyofinを使い、交差型のkeyとvalueを抽出する
  2. 交差型をMergeで包む

1

参考
  1. TypeScript のいろんな型テクニック - Zenn