#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. Пожалуйста, отредактируйте свой вопрос так, чтобы было ясно, о чем именно вы спрашиваете.