generated at
{....A, ...B} と & を区別する
罠っぽいが、当然の挙動


以下のような2つの型があったとき
ts
type Foo = { a: number }; type Bar = { b: string; c: boolean };
これらを結合した型を書きたい

以下は同じ意味になる
ts
type A1 = { a: number; b: string; c: boolean }; type A2 = Foo & Bar;
ここまでは良い
ここまでの話なら、 & {...A, ...B} は等しいものと見なされるべき!という気持ちになる

問題は、propertyがコンフリクトしたとき
ts
type Foo = { a: number; c: number }; type Bar = { b: string; c: boolean };
c が被っているが、それぞれ別の型になっている
これを「結合」したときにどういう型になるのが自然か?
この「結合」という言葉遣いが曖昧であることに注意する


1 「結合」とはmergeのことである
JSの {...A, ...B} 的なやつ
propertyがコンフリクトした場合は、後者の方を優先する
ts
type C = { a: number; b: string: c: boolean }
これを加味したものがMerge<F, S>



2 「結合」とはIntersectoinのことである
ts
type B = { a: number; b: string; c: number & boolean }
c は、 number かつ boolean であるような型
当然、そのような集合に属する値は存在しないので c: never になる
ts
type B = { a: number; b: string; c: never }
これを加味したものがMergeIntersections<T>