Почему перегрузка метода в этом случае приводит к ошибке?

#typescript #overloading

Вопрос:

Простой пример перегрузки, которого я пытаюсь достичь, но получаю ошибку. A и B реализуют IB. И A создает B в конструкторе. Затем вызывает метод карты b внутри своего собственного метода карты.

Вот пример случая ошибки:

 it('testOverloading', () => {  interface IB  {  map(a: number): number;  map(b: string): string;  }   class B implements IB  {  map(a: number): number  map(b: string): string;  map(a: number | string): number | string  {  return typeof a === "string" ? "aaa" : 555;  }  }   class A implements IB  {  private b:B;   constructor()  {  this.b = new B();  }   map(a: number): number  map(b: string): string;  map(a: number | string): number | string  {  return this.b.map(a);  }   }   const o = new A();  logger.debug(o.map("asd"));  logger.debug(o.map(123)); });  

Ошибка:

 TSError: ⨯ Unable to compile TypeScript: test/AppFactoryTest.ts(60,31): error TS2769: No overload matches this call.  Overload 1 of 2, '(a: number): number', gave the following error.  Argument of type 'string | number' is not assignable to parameter of type 'number'.  Type 'string' is not assignable to type 'number'.  Overload 2 of 2, '(b: string): string', gave the following error.  Argument of type 'string | number' is not assignable to parameter of type 'string'.  Type 'number' is not assignable to type 'string'.  

Что я пропустил?

UPD: Мне удалось исправить это, добавив дополнительную строку в класс B

 map(a: number | string): number | string;  

Но я все еще не понимаю, зачем это нужно делать. Любые объяснения будут оценены по достоинству!

Комментарии:

1. Добро пожаловать в Stack Overflow. Пожалуйста, отредактируйте свой вопрос так, чтобы было ясно, о чем именно вы спрашиваете.