在打字稿中键入annotatinig通用箭头函数?

时间:2017-12-25 21:50:10

标签: typescript arrow-functions

我想编写一个typescript函数,它以函数的方式对参数重复n次函数。递归在我看来是一个很好的建议。

我对vanilla ES的尝试如下。

const repeat = f => times => arg => {
  if(times <= 0) {
    return arg;
  } else {
    const val = repeat(f)(times-1)(f(arg))
    return val;
  }
}

我对该类型的最佳尝试不会通过编译。

const repeat = <T>(f: T=>T) => (times: number) => (arg: T) => {
  if(times <= 0) {
    return arg;
  } else {
    const val: T = repeat(f)(times-1)(f(arg))
    return val;
  }
}

修改 按照@arpl的建议,但没有写一个单独的接口,我在下面解决了。 “ret”的单独定义是允许适当推断返回类型。

const repeat = <T>(f: (a: T)=>T) => (t: number) => (a: T) => {
  const ret: T = t > 0 ? repeat(f)(t - 1)(f(a)) : a;
  return ret;
};

1 个答案:

答案 0 :(得分:3)

以下是使用界面的一种方法。

interface Repeat {
  <T>(f: (a: T) => T): (t: number) => (a: T) => T;
}

const repeat: Repeat = f => t => a => {
  return t > 0 ? repeat(f)(t - 1)(f(a)) : a;
};