TypeScript 2.8.0rc でも駄目でした。
事象
const x = {
a: 1
}
const y = {
a: "two"
}
const c = Object.assign({}, x, y);
c.a = ???; // a: number & string
本来なら c.a
は string
となって欲しいが、 Object.assign の型定義が assign<T, U>(target: T, source: U): T & U;
となっているせいで c.a
は number & string
となってしまう。
ネストしたオブジェクトでも &
されるとそのプロパティがユニオンされてしまうので駄目
const x = {
a: {
b: 1
}
}
const y = {
a: {
b: "two"
}
}
const c = Object.assign({}, x, y);
c.a.b = ???; // b: number & string
解決方法
本家は issue は立っているが type spread の機能で解決しようとしているためまだ掛かりそう。
とりあえずは utility-types の Assign にキャストしてしまえば問題はない。
Object.assign({}, a, b) as Assign<typeof a, typeof b>