flowtype:如何使用参数转发来注释高阶函数

时间:2016-12-27 03:29:05

标签: flowtype

我有一个函数foo

function foo(a: string, b: string, c: number, d: boolean): Promise<Result> {
  return new Promise(resolver => {
    ...
  });
}

// use foo
foo('hello', 'world', 3, true).then(...);

和一个高阶函数,它使用currying来获取函数和参数:

function hof(func: Function) {
  return async function (...args: any[]) {
    // forward the args to the func and get the result
    const result = await func(...args);
    // do something else with the result
  }
}

// use foo with higher-order function `hof`
hof(foo)('hello', 'world', 3, true);
         ^^^^^^^^^^^^^^^^^^^^^^^^^ lack type annotations

如何使用flowtype注释hof函数的整个部分:

  • hof interface
  • 转发参数...args:使用any[]将丢失原始类型
  • currying函数的返回类型

1 个答案:

答案 0 :(得分:0)

TL; DR

我仍在寻找更好的选择,但这到目前为止对我有用:

open

我遇到了类似的问题。也就是说,键入一个函数,该函数接受带有一组特定参数的函数,然后返回一个接受相同参数集的新函数,而我找不到确定的答案。

长版

这是研究流类型问题并尝试错误的结果。 These are all the variations I tried that work in some degree

function foo(a: string, b: string, c: number): string {
  return 'Yay!'
}
// Alternatively, interface Arguments {
type Arguments = {
    <A>((A) => any): [A],
    <A, B>((A, B) => any): [A, B],    
    <A, B, C>((A, B, C) => any): [A, B, C],     
    <A, B, C, D>((A, B, C) => any): [A, B, C, D],
}

function hof <T: Function> (t: T): (...$Call<Arguments, T>) => void {
  return (...args) => undefined;
}

hof(foo);
hof(foo)("This", "works", 2);
// hof(foo)("this", "should't", "work");
// hof(foo)("Correctly", "fails", 2, "when there are extra args");