Javascript 避免为手动curried函数推断为未知的类型变量

Javascript 避免为手动curried函数推断为未知的类型变量,javascript,typescript,functional-programming,type-inference,currying,Javascript,Typescript,Functional Programming,Type Inference,Currying,我通常通过箭头语法手动执行函数。一旦泛型类型参数发挥作用,类型推断似乎就会出现问题: 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; cons

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

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>

当我未经修改地图时,一切都按预期进行。如何在不丢失类型推断的情况下保留函数?

您只需将类型参数移动到实际用作参数的函数中即可

在这种情况下,F在映射中没有推断站点,它仅用于从调用的返回类型推断返回类型,而不是TS所做的事情,它在其他场景中确实从返回类型推断,但不是这个。将type参数移动到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")); 

嗯,那是微不足道的。再次成为新手感觉很奇怪。谢谢类型Const={Const:A};中的B类型变量有什么意义;?你当然知道幻影类型。我不是专家,但有一个用例是获得值构造函数的正确返回类型,即使在给定示例中,此时没有足够的数据,类型构造函数也被专门化为Const。有时根本没有数据-无/列表。我认为Const只是其中一个的变体,没有正确的值构造函数。当然,在一些场景中,它提供了必要的额外多态性/ReasonML@Thankyou嗯,我倾向于坚持普通人的语言,并充分利用它。。然而,Ocaml似乎是一种可爱的语言。