Почему машинописный текст не позволяет частично указывать аргументы типа, чтобы создать новую универсальную функцию из другой универсальной функции?

Я изучаю общие принципы машинописного текста, в частности Выражения создания экземпляров.

Интересно, почему машинописный скрипт не позволяет частично указывать аргументы типа в универсальной функции, чтобы создать новую универсальную функцию с меньшим количеством переменных типа (новая универсальная функция менее гибкая и допускает повторное использование с точки зрения типа, чем старая).

Например:

type TypeA = { a: string };         // line (1)

function mergeFunc<T_1, T_2>(a: T_1, b: T_2) {      // line (2)
    return { ...a, ...b };                          // line (3)
}

let newGenMergeFunc = mergeFunc<TypeA, Tp>;         // line (4)

В этом примере у меня есть одно определение типа (typeA) и функция mergeFunc, которые содержат две переменные типа (T_1 и T_2). Типовая подпись mergeFunc: mergeFunc<T_1, T_2>(a: T_1, b: T_2): T_1 & T_2

Я хочу создать более конкретную версию mergeFunc, используя выражение экземпляра. Я создал новую функцию (newGenMergeFunc), передав фактический тип TypeA первому параметру типа (T_1) и сохранив второй параметр типа как переменную типа (Tp).

Когда я запускаю приведенный выше пример, я ожидаю, что: newGenMergeFunc станет универсальной функцией с одной переменной типа (Tp) и ее сигнатурой:

newGenMergeFunc<Tp>(a: TypeA, b: Tp): TypeA & T_2. При этом TypeA — это фактический тип, а Tp — параметр типа (заполнитель типа или переменная типа). Однако компилятор Typescript не позволяет мне этого сделать.

Не могли бы вы указать причину? Спасибо за внимание к моему глупому вопросу.

Причина в том, что это недостающая функция. TS не позволяет пропускать обобщенные функции при вызове универсальной функции согласно ms/TS#10571, а также нет соответствующего способа сделать это с выражением создания экземпляра. Если вы хотите такого поведения, вам придется написать тип вручную, как показано в ответе Калета ниже.

jcalz 28.08.2024 17:04
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Можно, но использованный вами синтаксис неверен.

let newGenMergeFunc:<Tp> (a: TypeA, b: Tp) => TypeA & Tp = mergeFunc;

Чтобы Tp был действительным, вам нужен контекст, в котором mergeFunc<TypeA, Tp> уже является параметром типа, например.

function makeMergeFunc<Tp>(){ return mergeFunc<TypeA, Tp>; }
let unknownMergeFunc = makeMergeFunc();

Ссылка на игровую площадку

спасибо @Caleth, твой ответ меня так заинтересовал. Но в своем ответе let newGenMergeFunc:<Tp> (a: TypeA, b: Tp) => TypeA & Tp = mergeFunc; используйте Контекстную типизацию и не используйте Выражения создания экземпляров.

LeoPkm2-1 28.08.2024 16:42

@LeoPkm2-1 см. редактирование. Вам нужно место для Tp, которое будет представлено как параметр типа.

Caleth 28.08.2024 16:49

Большое спасибо, внимательно обдумав ваш ответ, я понял. Извините за такой поздний ответ. Моя искренняя благодарность

LeoPkm2-1 28.08.2024 19:12

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