Вам просто нужно переместить параметры типа в функцию, где они фактически используются в качестве параметров.
В этом случае F
не имеет сайта вывода в map
, он используется только в возвращении type (вывод из вызываемого возвращаемого типа, TS это не то, что делает, он выводит из возвращаемого типа в другом сценарии ios, но не это). Перемещение параметра типа в функцию, возвращаемую map
, позволяет второму вызову вывести F
и произвести ожидаемый тип.
type Const<A, B> = { const: A };
const Const = <A, B>(x: A): Const<A, B> => ({ const: x });
const map = <A, B>(f: (_: A) => B) => <F>(tx: Const<F, B>) => tx;
const inc = (x: number) => x + 1;
const foo = map(inc) (Const("foo"));
Playground Link