typescript函数覆盖高阶函数

时间:2018-03-08 19:30:11

标签: typescript fp-ts

我对此代码感到困惑:

/**
 * Lift a function of one argument to a function which accepts and returns values wrapped with the type constructor `F`
 */
export function lift<F extends URIS3>(
  F: Functor3<F>
): <A, B>(f: (a: A) => B) => <U, L>(fa: Type3<F, U, L, A>) => Type3<F, U, L, B>
export function lift<F extends URIS3, U, L>(
  F: Functor3C<F, U, L>
): <A, B>(f: (a: A) => B) => (fa: Type3<F, U, L, A>) => Type3<F, U, L, B>
export function lift<F extends URIS2>(
  F: Functor2<F>
): <A, B>(f: (a: A) => B) => <L>(fa: Type2<F, L, A>) => Type2<F, L, B>
export function lift<F extends URIS2, L>(
  F: Functor2C<F, L>
): <A, B>(f: (a: A) => B) => (fa: Type2<F, L, A>) => Type2<F, L, B>
export function lift<F extends URIS>(F: Functor1<F>): <A, B>(f: (a: A) => B) => (fa: Type<F, A>) => Type<F, B>
export function lift<F>(F: Functor<F>): <A, B>(f: (a: A) => B) => (fa: HKT<F, A>) => HKT<F, B>
/**
 * Lift a function of one argument to a function which accepts and returns values wrapped with the type constructor `F`
 * @function
 */
export function lift<F>(F: Functor<F>): <A, B>(f: (a: A) => B) => (fa: HKT<F, A>) => HKT<F, B> {
  return f => fa => F.map(fa, f)
}

我在fp=ts repo

中找到了这个

我对此感到相当困惑。每个函数<A, B>(f: (a: A) => B)的初始签名看起来都是一样的。

打字稿如何确定哪个是正确的调用?

2 个答案:

答案 0 :(得分:1)

我不知道fp-ts,但根据传入的lift()参数是FFunctor3<>,可能会选择Functor3C<>重载。 },Functor2<>Functor2C<>。我假设它们不同,允许编译器选择一个。

正如comment中提到的@Sam,您似乎正在查看lift()返回类型,它没有输入超载的等式被选中。 lift()会返回另一个函数,这可能让您感到困惑吗?

希望有所帮助。

答案 1 :(得分:0)

(f:(a:A)=&gt; B)在防御中使用通用类型。

您可以在此处阅读更多内容https://www.typescriptlang.org/docs/handbook/generics.html