流函数声明语法

时间:2016-08-31 09:11:28

标签: flowtype

我正在尝试在声明文件中记录工厂函数。 我的目标是使流动意识到我的简单工厂。

它用于koa v2路线,这是在我的服务中注入一些选项的方法。

这是工厂:

ctx.compose = function Compose<T: *>(service: Class<T>, options: ?Object): T {
  return new service(_.extend({}, ctx._requestOptions, options));
};

因为我使用koa v2,所以在声明中创建了一个类型KoaCtx,如下所示:

declare type KoaCtx = {
  params: { [key: string]: string },
  request: {
    query: { [key: string]: string },
    body: { [key: string]: string | boolean | Array<any> | Number | Date     | Object },
  },
  body: any,
  req: any,
  res: any,
  state: any,
  ...
  compose: compose: function <T: *>(service: Class<T>, options: ?Object): T
}

我尝试了不同的语法,但我一直都会遇到错误。

compose: function <T: *>(service: Class<T>, options: ?Object): T
                       ^ Unexpected token :

如果我将第一段代码放入我的koa路线中,它的工作正常! 我尝试在流配置中的[include]标签中添加带有ctx.compose定义的文件,但它不起作用。

更新

尝试了这个宣言:

declare function Compose<T: *>(service: Class<T>, options: ?Object): T;

declare type KoaCtx = {
    ...
    compose: Compose<Class<*>>
};

但不幸的是,它仍然没有用。

1 个答案:

答案 0 :(得分:0)

函数类型看起来像

myVar=600 prefixBioAwk -c fastx '{ if(length($seq) > '$myVar') { print ">"$name; print $seq }}' my.fasta > short.fasta

具有泛型的函数类型看起来像

(argName1: Type1, argName2: Type2, ...restName: Array<RestType>) => ReturnType

所以你可能应该写

<T>(argName1: Type1, argName2: Type2, ...restName: Array<RestType>) => ReturnType

也就是说,您使用存在类型declare type KoaCtx = { ... compose: <T: *>(service: Class<T>, options: ?Object) => T } 作为*的上限。我不确定这在这里是否有意义。所以我只是建议写

T

对于您的更新,您只能显式实例化类型别名,接口和类的类型参数。所以你可以写

declare type KoaCtx = {
  ...
  compose: <T>(service: Class<T>, options: ?Object) => T
}

但如果declare type Compose = <T>(service: Class<T>, options: ?Object) => T; declare type KoaCtx = { ... compose: Compose<MyClass> }; 是通用函数,则无法执行此操作。