gpt4 book ai didi

javascript - 避免手动柯里化(Currying)函数将类型变量推断为未知

转载 作者:行者123 更新时间:2023-12-02 20:51:43 24 4
gpt4 key购买 nike

我通常通过箭头语法手动柯里化(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;

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

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

Playground

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

最佳答案

您只需将类型参数移至实际用作参数的函数即可。

在这种情况下,Fmap中没有推断站点,它仅用于返回类型(从被调用的返回类型推断,不是TS所做的事情,它确实从其他场景中的返回类型推断出来,但不是这个)。将类型参数移至 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

关于javascript - 避免手动柯里化(Currying)函数将类型变量推断为未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61592541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com