Метод перегрузки с оператором распространения не распознан - PullRequest
2 голосов
/ 09 мая 2020

У меня есть следующее определение класса:

class Test {
  a(msg: string): string;
  a(msg: string, ...args: unknown[]): string | { msg: string, args: unknown[]} {
    if (args) {
      return { msg: msg, args: args };
    }
    return msg;
  }
}

Однако, если я сделаю это, я получу ошибки компиляции:

new Test().a("test", "a", 1, 2, 3);

«Ожидается 1 аргумент, но получен 5 "

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

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Реализация функции не является частью всех доступных перегрузок. Вместо этого вы можете написать:

class Test {
    a(msg: string): string; // overload 1
    a(msg: string, ...args: unknown[]): { msg: string, args: unknown[] } // overload2
    a(msg: string, ...args: unknown[]): string | { msg: string, args: unknown[] } { // impl
       // ...
    }
}
new Test().a("test", "a", 1, 2, 3); // { msg: string; args: unknown[]; }
new Test().a("test") // string

Пример игровой площадки

2 голосов
/ 09 мая 2020

Typescript не поддерживает перегрузку функций с другим количеством параметров.

Документация говорит:

TypeScript предоставляет концепцию перегрузки функций. У вас может быть несколько функций с одним и тем же именем, но с разными типами параметров и типом возвращаемого значения. Однако количество параметров должно быть одинаковым.
[...] Перегрузка функций с другим количеством параметров и типов с одинаковыми именами не поддерживается.

Один трюк для достижения того, что вы пробуют может быть это

interface ReturnA {
    msg: string;
    args: any[];
}

class Test {

  a(msg: string, ...args: never[]): string;
  a(msg: string, ...args: any[]): ReturnA
  a(msg: string, ...args: any[]): string | ReturnA {
    if (args) return { msg, args };
    return msg;
  }

}

const t = new Test();

// only 1 param returns string
const str: string = t.a(`a`); 

// two or more params returns the other object type
const obj: ReturnA = t.a(`a`, `param1`); 
...