我正在尝试在声明文件中记录工厂函数。 我的目标是使流动意识到我的简单工厂。
它用于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<*>>
};
但不幸的是,它仍然没有用。
答案 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>
};
是通用函数,则无法执行此操作。