避免为手动柯里化函数推断为未知的类型变量

Avoid type variable infered as unknown for manually curried functions

我通常通过箭头语法手动柯里化我的函数。一旦泛型类型参数发挥作用,类型推断似乎就会出现问题:

type Const<A, B> = { const: A };

const Const = <A, B>(x: A): Const<A, B> => ({ const: x });

const map = <F, A, B>(f: (_: A) => B) => (tx: Const<F, B>) => tx;

const inc = (x: number) => x + 1;

const foo = map(inc) (Const("foo")); // Const<unknown, number> instead of <string, number>

Playground

当我取消 map 时,一切都按预期进行。如何在不丢失类型推断的情况下保持函数的柯里化?

你只需要将类型参数移动到它们实际用作参数的函数中。

在这种情况下Fmap中没有推理位点,它只在return类型中使用(从被调用的return类型中推断,不是TS 所做的事情,它确实从其他场景中的 return 类型推断出来,但不是这个)。将类型参数移动到 return 由 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