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

#typescript

Вопрос:

У меня есть следующая функция, которая принимает любое количество аргументов. Однако я знаю, что первым аргументом должна быть функция, другие аргументы могут быть любыми, и я не знаю длину массива. Какую форму я должен придать типу массива известного 1-го элемента, но неизвестной длины и типов для других?

 // i tried also ...args: [Function, any], but eslint does not like the generic 'Function' type and throw an error

function test(...args: Array<????>) {
 const [callbackFn, ...restOfArgs] = args;
 // do whatever
}
 

Ответ №1:

Вы можете отделить первый аргумент, а затем использовать синтаксис «…» для захвата остальных аргументов. Замените () => void его на любой тип функции обратного вызова.

 function test(callbackFunction: () => void, ...args: unknown[]): void {
  callbackFunction()
  // access the rest of the arguments as you would from an array
}
 

https://www.typescriptlang.org/play?#code/LAKAZgrgdgxgLgSwPZQARwKYGc4AoYCGANkQEYEwDWAYtPMlAFyq4CUqAvAHyoBuSCACYAaVADoJBAE4BzLM2iUoSAO5QA2gF1WzfkNQBvUKlSES5KrViIUbUAF9QQA

ПРАВКА: Я понял, что не полностью ответил на вопрос. Если вы хотите сохранить все аргументы в одной и той же переменной, вы можете сделать это следующим образом:

 function test(...args: [() => void, ...unknown[]]): void {
  args[0]()
}