Аргументы обратного вызова Typescript, которые разрешаются с помощью функции - PullRequest
0 голосов
/ 24 августа 2018

У меня есть ситуация, когда я вызываю функцию с некоторыми аргументами, которые разрешаются с помощью другой функции.

Так выглядит код.

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback) {
  callback(...getArgs())
}

callFnWithArgs(function (/* typehint here */) {
})
  1. Функция callFnWithArgs принимает обратный вызов и затем выполняет его, передавая некоторые аргументы.
  2. Эти аргументы передаются другой функцией с именем getArgs().

Итак, есть ли способ напечатать подсказку, аргументы обратного вызова, которая является возвращаемым значением другой функции?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Вы можете либо определить тип callback:

function callFnWithArgs (callback: (a: string, b: number) => void) {
  callback(...getArgs())
}

Или, если есть возможность передавать аргументы извне функции callFnWithArgs, вы можете использовать Общие параметры покоя :

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs<T extends any[]>(args: T, callback: (...args: T) => void) {
  callback(...args);
}

callFnWithArgs(getArgs(), (str, nr) => {
})

Еще один подход заключается в создании перегрузок с универсальными типами для параметров:

function getArgs(): [string, number] {
  return ['hello world', 22]
}
function callFnWithArgs<T>(callback: (a: T) => void);
function callFnWithArgs<T1, T2>(callback: (a: T1, b: T2) => void);
function callFnWithArgs(callback: (...args: any[]) => void) {
  callback(...getArgs());
}

callFnWithArgs<string, number>((str, nr) => {
})
0 голосов
/ 25 августа 2018

В TypeScript 3.0 или новее вы можете использовать псевдоним типа ReturnType из стандартной библиотеки, чтобы определить тип возвращаемого значения getArgs, а затем использовать параметр rest, чтобы связать его с обратным вызовом callFnWithArgs:

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback: (...args: ReturnType<typeof getArgs>) => void) {
  callback(...getArgs())
}

callFnWithArgs(function (a, b) {
  // a is string, b is number
})
0 голосов
/ 24 августа 2018

Решает ли это вашу задачу?

function getArgs(): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback: (a: string, b: number) => void) {
  const [a, b] = getArgs();
  callback(a, b);
}

callFnWithArgs(function (a: string, b: number) {
})
...