#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). Своим ответом вы заставили меня усомниться в том, что это вообще возможно, но я бы так и подумал. XD5. Я обновил свой код, чтобы показать, что эти параметры также будут передаваться через
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;
}