代码之家  ›  专栏  ›  技术社区  ›  Marcus Junius Brutus

函数声明中可重用函数类型的语法

  •  4
  • Marcus Junius Brutus  · 技术社区  · 8 年前

    这是如何将变量/常量注释为持有特定类型的函数:

    declare type TFunction = () => any;
    const foo: TFunction = function foo() {};
    

    当一个 宣告 函数:

    function boo() {}
    

    ?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Andy    7 年前

    没有办法 : TFunction function boo() 公告但是,您可以通过编写no op语句对其进行流检查 (boo: TFunction); 后来唯一的缺点是这样评估 boo 在运行时。

    不过,最好的方法可能是不用担心明确声明 喝倒采 TFunction ,而只需在任何时候使用流来检查 喝倒采 a 功能 是预期的。

    这里有一个更具体的例子来说明我的意思:( Try flow link )

    /* @flow */
    
    type ArithmeticOperation = (a: number, b: number) => number;
    
    function add(a: number, b: number): number {
      return a + b;
    }
    
    function concat(a: string, b: string): string {
      return a + b;
    }
    
    function fold(array: Array<number>, operation: ArithmeticOperation): number {
      return array.reduce(operation);
    }
    
    fold([1, 2, 3], add); // ok because add matches ArithmeticOperation
    fold([1, 2, 3], concat); // flow error because concat doesn't match
    
        2
  •  0
  •   Palpatim    7 年前

    这个问题讨论得太晚了,但是如果您讨论的是“编译时声明,独立于代码,使用 declare 关键字”,然后根据 Flow declarations docs ,您应该能够像这样声明全局:

    declare var boo: TFunction;
    

    或作用域项作为其包含模块或类型的成员:

    declare class FunctionHolder {
      boo: TFunction;
    }