Общий Typescript зависит от порядка параметров, в то время как он не должен

У меня есть общий mergeArrays, который не зависит от порядка параметров. Но при использовании внутри другого дженерика кажется, что результат зависит. Но это непонятно.

type Fn = (...args: any[]) => any;

type arr1LessThanOrEqual<
  T1 extends ReadonlyArray<any>,
  T2 extends ReadonlyArray<any>
  > = T1["length"] extends T2["length"]
  ? true
  : T2["length"] extends 0
  ? false
  : T2 extends [infer First, ...infer Rest]
  ? Rest extends ReadonlyArray<any>
  ? arr1LessThanOrEqual<T1, Rest>
  : never
  : never;

type mergeArrWithLeft<
  T1 extends ReadonlyArray<any>,
  T2 extends ReadonlyArray<any>
  > = readonly [
    ...{
      readonly [Index in keyof T1]: Index extends keyof T2
      ? (T1[Index] & T2[Index])
      : T1[Index];
    }
  ];

type mergeArrays<
  T1 extends ReadonlyArray<any>,
  T2 extends ReadonlyArray<any>
  > = arr1LessThanOrEqual<T1, T2> extends true
  ? mergeArrWithLeft<T2, T1>
  : mergeArrWithLeft<T1, T2>;

и здесь я использую этот универсальный:

type LargestArgumentsList<T extends ReadonlyArray<any>> = T extends readonly [
  (...args: infer Args) => any,
  ...infer Rest
] ?
  mergeArrays<LargestArgumentsList<Rest>, Args> // here if I swap it does not work, but generic mergeArrays does not depend on order of params, so  it is a  mistery
  : readonly [];

и это работает. но если я поменяю его на:

type LargestArgumentsList<T extends ReadonlyArray<any>> = T extends readonly [
  (...args: infer Args) => any,
  ...infer Rest
] ?
  mergeArrays<Args, LargestArgumentsList<Rest>>
  : readonly [];

поведение LargestArgumentsList отличается, здесь детская площадка

Я попытался создать дженерик, который находит самый длинный список аргументов в массиве функции. И я ожидаю, что mergeArrays generic не будет зависеть от порядка параметров. Я тестировал, и это не зависит от порядка параметров. Но внутри другого дженерика(LargestArgumentsList) это работает по-другому.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В определении arr1LessThanOrEqual отсутствует readonly в ограничении T2 extends [infer First, ...infer Rest]. Поскольку Args не только для чтения, arr1LessThanOrEqual работает, когда Args является вторым параметром, но если вы замените его на LargestArgumentsList<Rest> только для чтения, произойдет сбой.

Если вы замените ограничение на

T2 extends readonly [infer First, ...infer Rest]

LargestArgumentsList будет работать, даже если параметры поменялись местами.

Площадка TypeScript

Другие вопросы по теме

Создайте реагирующий компонент для условной упаковки дочерних элементов
Динамический тип зависит от первого атрибута
Почему существует `rxjs/no-async-subscribe`? Что не так с `async` внутри `subscribe`
Состояние сбрасывается при изменении значений в объекте, только при заполнении из другого источника
Если реквизит пуст/не определен, показать ошибку перед возвратом полного компонента?
Попытка разрезать объект javascript внутри разбивки на страницы таблицы, но не удается получить доступ к свойствам объекта
Убедитесь, что логика службы angular не запускается дважды для пользователя
Как передать переменную как имя поля ассоциативного массива
Как я могу получить доступ к полю массива объекта в TypeScript? Тип 'unknown' должен иметь метод '[Symbol.iterator]()', который возвращает итератор
Нет подходящего токена инъекции для параметра «функции» класса «TodosComponent»