Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 基于第一个参数的函数参数动态类型_Function_Typescript_Visual Studio Code - Fatal编程技术网

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

Function 基于第一个参数的函数参数动态类型,function,typescript,visual-studio-code,Function,Typescript,Visual Studio Code,现在我有一个非常通用的函数,当我的客户机与我的服务器对话时,它会命中。因此,为了保持灵活性,我正在这样做: public call(method: string, ...parameters: any[]) {} this.socketManager.call('findOne', ...) this.socketManager.methods.findOne( 但在我的服务器上,我将所有方法放在一起,如下所示: MethodManager.methods({ findOne: {

现在我有一个非常通用的函数,当我的客户机与我的服务器对话时,它会命中。因此,为了保持灵活性,我正在这样做:

public call(method: string, ...parameters: any[]) {}
this.socketManager.call('findOne', ...)
this.socketManager.methods.findOne(
但在我的服务器上,我将所有方法放在一起,如下所示:

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();
        }
    }
}
如您所见,每个方法可能有不同的参数。当我在客户机上编写代码时,我无法充分利用Typescript的潜力,因为它是“任意”铸造的

如何使visual studio代码在编写这行代码时能够识别:

this.socketManager.call('findOne', 
它会弹出一个助手列表,如下所示:

(method: 'findOne', collection: string, query: Object)
但当我打字时:

this.socketManager.call('find',
它给了我:

(method: 'find', collection: string, query: Object, sortQuery: Object = {})
而不是无用的:

(method: string, ...parameters: any[])

这可能吗?这将对开发有极大的帮助。

您可以使用Typescript中的函数重载执行类似操作:

这是:


我通过编写一个脚本来实现这一点,该脚本遍历所有方法文件,解析它们并获取函数和参数。此脚本在编译服务器代码时运行(获取更改),然后在启动时加载的客户端上重新创建生成的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);
        },
        ...
    };
}
那么我是这样用的:

public methods = SERVER_METHODS(this);
现在不是这样做:

public call(method: string, ...parameters: any[]) {}
this.socketManager.call('findOne', ...)
this.socketManager.methods.findOne(
我正在这样做:

public call(method: string, ...parameters: any[]) {}
this.socketManager.call('findOne', ...)
this.socketManager.methods.findOne(

这给了我这个函数的参数。非常手动的解决方案,但它可以工作,现在是自动的。

这就是我要找的。还有两个问题。1.这可以动态完成吗?例如,如果我的服务器在连接启动时发送一个可能的方法调用列表,那么客户端是否可以获取该列表并创建您的答案的动态版本?2.是否有方法获取MethodManager.methods(这只是一个方法数组)并提取每个函数所需的函数参数?当然,我可以看到动态生成此函数。从服务器的响应来看,我相信只需对其进行迭代并为每个响应发出一个调用签名。如果是我,我可能会为每个方法生成一个具有单独函数的客户机,而不是单个调用函数。i、 e.您实际上已经定义了
client.find
client.findOne