Метод переопределения с различными типами аргументов в расширенном классе - Typescript - PullRequest
0 голосов
/ 06 июня 2018

Я хочу переопределить метод и передать ему различные типы аргументов:

class Base {
    public myMethod(myString: string): undefined {
        return;
    }
}

class Child extends Base {
    public myMethod(myNumber: number): undefined {
        return super.myMethod(String(myNumber));
    }
}

И все же это приводит к ошибке машинописи:

Свойство 'myMethod' в типе 'Child'нельзя назначить одному и тому же свойству в базовом типе' Base '.Тип '(myNumber: number) => undefined' нельзя назначить типу (myString: string) => undefined '.Типы параметров «myNumber» и «myString» несовместимы.Тип 'string' нельзя назначить типу 'number'.

Есть ли способ сделать это без создания ошибки машинописного текста?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Как уже упоминалось другими, это не очень хорошая идея, потому что вы нарушаете замену Лискова.

То, что вы можете легко сделать, это обеспечить переопределение, которое принимает как string, так и number.Это позволяет вашему классу все еще использоваться везде, где ожидается базовый класс.

class Base {
     public myMethod(myString: string): undefined {
         return;
     }
 }

class Child extends Base {
    public myMethod(myNumberOrString: number | string): undefined {
        if (typeof myNumberOrString === 'number') {
            return super.myMethod(String(myNumberOrString));
        } else {
            return super.myMethod(myNumberOrString);
        }
    }
}
0 голосов
/ 07 июня 2018

Нет способа сделать это *.В TypeScript наследование подразумевает подтип , поэтому вы не можете наследовать от базового класса, не являясь его допустимым подтипом.

* Технически не верно, но яя не буду упоминать их, потому что они грубые хаки, которые вы не должны делать.

...