基于第一个参数的函数参数动态类型

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)

这给了我该函数的参数。相当手动的解决方案,但它有效,而且现在是自动化的。