use*_*362 5 function typescript visual-studio-code
现在我有一个非常通用的功能,当我的客户端与我的服务器对话时,它就会命中。因此,为了保持灵活性,我这样做:
public call(method: string, ...parameters: any[]) {}
Run Code Online (Sandbox Code Playgroud)
不过,在我的服务器上,我将所有方法保存在一起,如下所示:
MethodManager.methods({
findOne: {
function: function(collection: string, query: Object) {
return model(collection).findOne(query).exec();
}
},
find: {
function: function(collection: string, query: Object, sortQuery: Object = {}) {
return model(collection).find(query).sort(sortQuery).exec();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每个方法可能有不同的参数。当我在客户端编写代码时,我无法充分利用 Typescript 的潜力,因为它是“任意”类型的。
我怎样才能做到这一点,以便 Visual Studio 代码在我编写这行代码时能够识别:
this.socketManager.call('findOne',
Run Code Online (Sandbox Code Playgroud)
它会弹出一个帮助列表,如下所示:
(method: 'findOne', collection: string, query: Object)
Run Code Online (Sandbox Code Playgroud)
但是当我输入:
this.socketManager.call('find',
Run Code Online (Sandbox Code Playgroud)
它给了我:
(method: 'find', collection: string, query: Object, sortQuery: Object = {})
Run Code Online (Sandbox Code Playgroud)
而不是无益的:
(method: string, ...parameters: any[])
Run Code Online (Sandbox Code Playgroud)
这可能吗?这对发展将是一个巨大的帮助。
use*_*362 -1
我通过编写一个脚本来实现这一点,该脚本遍历所有方法文件,解析它们并获取函数和参数。该脚本在服务器代码的编译时运行(获取更改),然后在客户端上重新创建生成的methods.ts 文件,我在启动时加载该文件。
export function SERVER_METHODS(socketManager) {
return {
findOne: (collection: string, query: Object, cb?: Function) => {
socketManager.call('findOne', collection, query, cb);
},
find: (collection: string, query: Object, sortQuery: Object = {}, cb?: Function) => {
socketManager.call('find', collection, query, sortQuery, cb);
},
...
};
}
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
public methods = SERVER_METHODS(this);
Run Code Online (Sandbox Code Playgroud)
现在不要这样做:
this.socketManager.call('findOne', ...)
Run Code Online (Sandbox Code Playgroud)
我正在这样做:
this.socketManager.methods.findOne(
Run Code Online (Sandbox Code Playgroud)
这给了我该函数的参数。相当手动的解决方案,但它有效,而且现在是自动化的。
| 归档时间: |
|
| 查看次数: |
7304 次 |
| 最近记录: |