Typescript — функция с несколькими параметрами в качестве обратного вызова

#javascript #typescript

#javascript #typescript

Вопрос:

У меня есть следующий код :

 
function builder<T extends Foo>(
  getItems: (...) => Promise<T[]>, /* unsure what to put between parenthesis here */
) {
  return async (...): Promise<Baz> => { 
    const items = await getItems(...); /* unsure what to put between parenthesis here */
    // some manipulation here
    return items;
}
  

Моя цель — разрешить builder функции принимать асинхронный обратный вызов. Этот обратный вызов может быть вызван с различными типами параметров. Внутри обратного вызова может быть один или несколько параметров.

Например, я мог бы вызвать такую builder функцию, как :

 // call 1 
builder<SomeResult>((a, b) => someCallback(a, b));

// call 2
builder<AnotherResult>((c) => otherCallback(c)); 
  

Я довольно новичок в typescript, поэтому не совсем уверен, как это сделать. Я думаю, может быть, мне следует изучить аргументы rest, но не совсем уверен, как решить проблему.

Любая помощь будет высоко оценена. Большое спасибо за советы.

Комментарии:

1. Когда передаваемая вами функция может принимать несколько аргументов, откуда берутся эти аргументы? Вы не можете просто создавать их из ниоткуда.

2. Согласен, но я хотел сказать, что эти аргументы (a, b, c) могут быть любого типа. Например, a может быть датой, b может быть числом, c может быть логическим значением. В builder я просто хочу иметь возможность вызывать getItems с любыми аргументами, которые были переданы через обратный вызов.

3. …но аргументы, передаваемые обратному вызову, являются аргументами, с которыми вы вызываете getItems , так как бы builder узнать, что передать?

4. getItems является функцией обратного вызова. Я хочу builder передать любые аргументы, которые я указал при определении моего обратного вызова (a, b или c). Своим ответом вы заставили меня усомниться в том, что это вообще возможно, но я бы так и подумал. XD

5. Я обновил свой код, чтобы показать, что эти параметры также будут передаваться через return async (...): Promise<Baz> => { .

Ответ №1:

Если кто-нибудь погуглит это, наконец, пошел с :

 function builder<T extends Foo>(
  getItems: (...addedParams: any[]) => Promise<T[]>, 
) {
  return async (...addedParams: any[]): Promise<Baz> => { 
    const items = await getItems(...addedParams); 
    // some manipulation here
    return items;
}