Я работаю над функцией TypeScript для объединения двух объектов. Проблема в том, что объекты TypeScript могут содержать дополнительные ключи, которые не видны в сигнатуре типа. Есть ли способ отбросить такие дополнительные элементы, чтобы ограничить объекты их известными свойствами?
import * as assert from 'assert';
const merge = <A, B>(a: A, b: B): A & B => ({
...a,
...b,
})
type Foo = { foo: 123 }
type Bar = { bar: 456 }
const assertFoo = <T extends Foo>(t: T) => t
const assertBar = <T extends Bar>(t: T) => t
const foo: Foo = assertFoo({ foo: 123 })
const bar: Bar = assertBar({ foo: 'MINE', bar: 456 })
type FooBar = { foo: 123, bar: 456 }
const foobar: FooBar = merge(foo, bar);
assert.equal(foobar, { foo: 123, bar: 456 }); // Error: foo is 'MINE'