В typescript как вы добавляете дженерики к функции, которую вы ожидаете вызвать с помощью .call

#typescript

#typescript

Вопрос:

 interface Wrapped<T> {
  data: T;
}

interface BetterWrapper<T> {
  betterData: T;
}

function abc<T>(test: Wrapped<T>): BetterWrapper<T> {
  return {betterData: test.data}
}

const result = abc<string>.call({}, { data: 'hello' });
 

Учитывая что-то вроде приведенного выше, я вижу ошибку, в которой говорится, что не удается найти вызов name . Я предполагаю, что это потому, что возвращаемый тип представляет собой строку, если да, то как правильно сейчас представить это в typescript?

Комментарии:

1. Обобщения переносятся на тип call метода каждой функции. Не передавайте аргументы явного типа! Напишите abc.call нет abc<string>.call , но если вы хотите быть неудобным, передавая аргумент типа явно, это было бы abc.call<string>

2. @AluanHaddad abc.call<string> не работает ( call принимает 3 параметра типа: this тип, типы аргументов как тип кортежа и возвращаемый тип).

3. Хороший момент, я забыл о дополнительных параметрах. Лучше всего просто использовать вывод.

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

5.Вывод часто не работает, особенно по мере усложнения универсальной функции. Но даже что-то такое простое, как это, не работает: function foo<T, This>(this: This, f: (x:T) => void) {} foo.call(this, function(this: MyClass, x: number) {});

Ответ №1:

Вот решение, объявляющее интерфейс, в котором call есть требуемая общая подпись: вы можете использовать abc.call<string>(...) или просто abc.call(...) и позволить вывести параметр типа.

 interface AbcInterface {
  <T>(test: Wrapped<T>): BetterWrapper<T>;
  call<T>(thisObj: object, arg: Wrapped<T>): BetterWrapper<T>;
}
const abc: AbcInterface = test => ({betterData: test.data});

// result: BetterWrapper<string>
const result = abc.call({}, { data: 'hello' });
 

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