在打字稿中创建传递功能

时间:2019-07-05 15:09:15

标签: typescript

我很好奇如何创建一个带类型的函数,该函数允许您将输入的函数的类型作为返回类型和参数进行传递。

const preventDefault = function <T> (passThroughFunction: T) {
  return function (event, ...args): ReturnType<typeof T> {
    event.preventDefault();
    return passThroughFunction(...[event, ...args]);
  } 
}

这是坏的。我不确定如何正确使用ReturnType或从passThroughFunction中提取参数并将其包含在返回的函数中。

所以我可以这样使用它:

<Button onSubmit={preventDefault(onSubmit)}/>

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我认为您最好不要使用条件类型。它们将在实现中需要类型断言(因为条件类型只要它们仍然具有自由类型参数就不会解析)

这将起作用,并且实际上将允许上下文类型从分配目标流到您定义的函数,因此,如果使用内联函数,则会得到参数类型推断

const preventDefault = function <E extends SyntheticEvent, A extends any[], R> (passThroughFunction: (e: E, ...a: A) => R) {
  return function (event: E, ...args: A): R {
    event.preventDefault();
    return passThroughFunction(event, ...args);
  } 
}

let o = () => <button onClick={preventDefault(e => e.movementX)}></button>
let o2 = () => <div onKeyDown={preventDefault(e => e.keyCode)}></div>