Mecanografiado, fusionar tipos de objeto?

¿Es posible fusionar los accesorios de dos tipos de objetos genéricos? Tengo una función similar a esta:

function foo<A extends object, B extends object>(a: A, b: B) {
    return Object.assign({}, a, b);
}

Me gustaría que el tipo sea todas las propiedades en A que no existen en B, y todas las propiedades en B.

merge({a: 42}, {b: "foo", a: "bar"});

da un tipo bastante extraño de{a: number} & {b: string, a: string}, a es una cadena sin embargo. El retorno real da el tipo correcto, pero no puedo entender cómo lo escribiría explícitamente.

Respuestas a la pregunta(3)

Su respuesta a la pregunta