#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' });