Чтобы проиллюстрировать, что я имею в виду под «распаковкой», рассмотрим следующий пример
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)
}
Есть способ заставить это работать? Если нет, то это где-то задокументировано?