Если вы посмотрите на определение Object.assign, оно в значительной степени отвечает на вопрос:
interface ObjectConstructor {
assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;
}
, используйте оператор & для создания типа пересечения - к сожалению, похоже, что он не может создатьчто-то более мелкое, чем это.