У меня есть следующее определение каррированной функции в машинописном:Тип вывода в машинописном для кэрри функции
interface Curried2<A, B, Z> {
(_0: A): (_0: B) => Z;
(_0: A, _1: B): Z;
}
У меня есть следующая функция, которая должна принять функцию (кэрри или нет):
function apply<T, U>(f: (_0: T) => U, x: T): U {
return f(x);
}
Теперь, учитывая
let curried: Curried2<number, boolean, string> = ...
следующих работ (как и ожидалось):
apply<number, (_0: boolean) => string>(curried, 4);
Но машинопись не может определить тип по себе:
apply(curried, 4);
(Даже если есть только одна перегрузка для ()
которая принимает одно значение.) Он жалуется:
Argument of type 'Curried2<number, boolean, string>' is not assignable to parameter of type '(_0: number) => string' ...Она правильно inferred
T
, но выведено
U
будет
string
. Почему это? Что я могу сделать, чтобы сделать работу типа для меня в этом случае (поскольку явно указано
T
и
U
слишком многословно для моего вкуса)?
Заранее благодарен!
В этом случае я бы потерять возможность использовать функцию в качестве обычного неработающая функция, так что это не сработает, к сожалению :( –
Вот и все! Единственное различие между вашим примером (в котором работает вывод типа) и моим (в котором это не так) - это порядок перегруженных методов 'Curried 'Любая идея, почему это так? –
Теперь следующее не будет работать:' function applyTwo
(f: (x: S, y: T) => V, x: S, y: T): V {return f (x, y); }; applyTwo (f1, "23", 23); 'Что, как вы думаете, является причиной этого? –