TypeScript Объединение N объектов, сохраняющих типы - PullRequest
0 голосов
/ 16 января 2020

Учитывая произвольное количество объектов различной формы, возможно ли, чтобы 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 Ответ

0 голосов
/ 16 января 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...