Typescript распаковывает аргументы в перегруженную функцию

Чтобы проиллюстрировать, что я имею в виду под распаковкой, рассмотрим следующий пример.

function simpleFunc(a: number, b: string): void { /* ... */ }
function simpleProxy(args: [number, string]) {
    simpleFunc(...args)
}

Это прекрасно работает с сопоставлением машинописного текста [число, строка] с (a: число, b: строка). У меня есть вариант использования, когда мне нужно сделать что-то подобное с более сложной функцией, которая имеет перегруженные сигнатуры, например:

function overloadFunc(name: string): void
function overloadFunc(name: string, content: number): void
function overloadFunc(content: number): void
function overloadFunc(name_or_content: string | number, maybe_content?: number): void {
    /* ... */
}

Теперь не могу заставить распаковку компилировать. Я пробовал это:

function overloadProxy1(args: [string] | [string, number] | [number]) {
    overloadFunc(...args);
    //           ^^^^^^^
    // Expected 1-2 arguments, but got 0 or more.(2556)
    // ... An argument for 'name' was not provided.
}

И это:

function overloadProxy2(args: [string | number, number?]) {
    overloadFunc(...args);
    //           ^^^^^^^
    // Argument of type 'string | number' is not assignable to parameter of type 'string'.
    // Type 'number' is not assignable to type 'string'.(2345)
}

Есть ли способ сделать эту работу? Если нет, то это где-то задокументировано?


person Antoine    schedule 09.07.2020    source источник


Ответы (1)


Ответ заключается в этой прекрасной утилите типа Parameters:


// This way if you want to call it like overloadProxy1(['name'])
function overloadProxy1(args: Parameters<typeof overloadFunc>) {
  // ...
}

// Or this way if you want to call it like overloadProxy1('name')
function overloadProxy1(...args: Parameters<typeof overloadFunc>) {
  // ...
}

Ссылка на игровую площадку TypeScript

Ссылка на документацию

person Ján Jakub Naništa    schedule 09.07.2020