{....A, ...B} と & を区別する
罠っぽいが、当然の挙動
以下のような2つの型があったとき
tstype Foo = { a: number };
type Bar = { b: string; c: boolean };
これらを結合した型を書きたい
以下は同じ意味になる
tstype A1 = { a: number; b: string; c: boolean };
type A2 = Foo & Bar;
ここまでは良い
ここまでの話なら、 &
と {...A, ...B}
は等しいものと見なされるべき!という気持ちになる
問題は、propertyがコンフリクトしたとき
tstype Foo = { a: number; c: number };
type Bar = { b: string; c: boolean };
c
が被っているが、それぞれ別の型になっている
これを「結合」したときにどういう型になるのが自然か?
この「結合」という言葉遣いが曖昧であることに注意する
1 「結合」とはmergeのことである
JSの {...A, ...B}
的なやつ
propertyがコンフリクトした場合は、後者の方を優先する
tstype C = { a: number; b: string: c: boolean }
2 「結合」とはIntersectoinのことである
tstype B = { a: number; b: string; c: number & boolean }
c
は、 number
かつ boolean
であるような型
当然、そのような集合に属する値は存在しないので c: never
になる
tstype B = { a: number; b: string; c: never }