【问题标题】:Decompose array to function arguments in TypeScript\JavaScript [duplicate]在 TypeScript\JavaScript 中将数组分解为函数参数 [重复]
【发布时间】:2019-09-01 01:05:59
【问题描述】:

我有一个不同类型的对象实例数组。

var instances: any = [];
instances["Object1"] = new TypeA();
instances["ObjectB"] = new TypeB();

每种类型都有自己的方法,具有不同的名称和参数数量。 我想通过调用一个函数并将数据传递给它来调用此方法,以识别要调用的方法和必要的参数值(我从客户端发送此数据)。

function CallMethod(data){
  let args = data.args;// it's array
  instances[data.objectId][data.methodId](??????); 
}

是否可以自动分解args 数组以将其值作为不同的函数参数传递?

像这样:

instances[data.objectId][data.methodId](args[0], args[1], ... args[n]); 

【问题讨论】:

  • 我想提供一个类型安全的版本......但我想既然它很快就关闭了,我再也不能了:(
  • class TypeA { method(s: string) { } } class TypeB { foo(s: string, n: number) { } bar(n: number) { } } var instances = { "Object1": new TypeA(), "ObjectB": new TypeB(), } function CallMethod< K extends keyof typeof instances, M extends keyof typeof instances[K]>(data: { objectId: K } & { methodId: M } & { args: typeof instances[K][M] extends (...a: any) => any ? Parameters<typeof instances[K][M]> : never }) { let args = data.args; (instances[data.objectId][data.methodId] as any)(...args); }
  • 听起来不错,但您能解释一下您的解决方案吗?尤其是这一行:{ args: typeof instances[K][M] extends (...a: any) => any ? Parameters<typeof instances[K][M]> : never }

标签: javascript typescript


【解决方案1】:

使用Spread Syntax

function CallMethod(data){
  let args = data.args;// it's array
  instances[data.objectId][data.methodId](...args); 
}

【讨论】:

  • 投反对票有什么原因吗?
【解决方案2】:

你可以使用...来破坏函数参数的数组,也称为spread。你可以阅读更多关于它的信息here

instances[data.objectId][data.methodId](...args); 

所以你的功能是:

function CallMethod(data){
    let args = data.args;// it's array
    instances[data.objectId][data.methodId](...args); 
}

【讨论】:

    【解决方案3】:

    扩展运算符将在这里工作

    function CallMethod(data){
      let args = data.args;
      instances[data.objectId][data.methodId](...args); 
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 2016-04-04
      • 2014-12-23
      • 2019-06-28
      • 1970-01-01
      • 2020-12-04
      • 2023-03-03
      • 2020-04-17
      相关资源
      最近更新 更多