У меня есть массив экземпляров объектов разных типов.
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 [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете разрушить массив для параметров функции, используя ... Он также известен как распространение. Подробнее об этом можно прочитать здесь.
instances[data.objectId][data.methodId](...args);
поэтому ваша функция будет:
function CallMethod(data){
let args = data.args;// it's array
instances[data.objectId][data.methodId](...args);
}
здесь будет работать оператор спреда
function CallMethod(data){
let args = data.args;
instances[data.objectId][data.methodId](...args);
}
Либо используйте оператор спреда, либо используйте
.callили.applydeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…