TypeScript Объединение N объектов, сохраняющих типы

Учитывая произвольное число объектов различной формы, возможно ли для TypeScript правильно утверждать информацию о типе?

Пример:

const merge = (...objects) => {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}

Мой фактический вариант использования гораздо сложнее, но сигнатура типа будет похожа.

Вот что работает, но я надеюсь, что это не единственное решение:

function merge<T1, T2>(...objects: [T1, T2]): T1 & T2;
function merge<T1, T2, T3>(...objects: [T1, T2, T3]): T1 & T2 & T3;
function merge(...objects) {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}

Мои проблемы с этим заключаются в том, что он не может быть скомпилирован с более новыми версиями TypeScript, и он вообще не поддерживается.

Есть ли лучший способ добиться этого?

Всего 1 ответ


После еще нескольких раундов экспериментов, вот решение, которое работает, хотя я все еще хотел бы видеть некоторое улучшение:

function merge<R>(...objects: Partial<R>[]): R {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}

Это подходит к проблеме с другой стороны - определение возвращаемого типа и подписи квалифицирует любые частичные реализации того, что возвращено.


Есть идеи?

10000