Могу ли я изменить тип возвращаемого значения метода в расширенном классе? - PullRequest
2 голосов
/ 21 октября 2019

Мне нужен класс B Расширение интерфейса C, однако я хотел бы использовать реализацию A::methodA для вычисления результата B::methodA.


interface C {
  methodA(): number
}

class A {
  methodA(): string {
    return '42'
  }
}

class B extends A implements C {
  methodA(): string {
    return Number(super.methodA()).
  }
}

Могу ли я использовать реализацию класса A с наследованием или ассоциация моя единственная надежда?

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Вы можете сделать метод A в классе A типом возврата любым, а не строкой.

interface C {
   methodA(): number
}

class A {
  protected methodA(): any {
    return '42'
  }
}

class B extends A  implements C {
    methodA(): number {
      return Number(super.methodA());
  }
}
0 голосов
/ 21 октября 2019

В javaScript мы, вероятно, говорим о наследовании между объектами, а не классами. Вот простая реализация вашего примера с использованием прототипа

class A {
    constructor (){}
    methodA() {
        return '42'
    }
}

class B extends A{
    constructor (){
        super();
    } 
    methodA(){};
}

b = new B();
a = new A();

B.prototype.methodA = function (nbr){ return 1 * nbr};
console.log("B " + b.methodA('4'))
0 голосов
/ 21 октября 2019

вы можете определить тип возврата метода A() на интерфейсе C до number | string,, это должен быть совместимый тип возврата.

interface C {
  methodA(): number | string
}

class A {
  methodA(): string {
    return '42'
  }
}

class B extends A implements C {
  methodA(): string {
    return super.methodA();
  }
}

РЕДАКТИРОВАТЬ: поэтому, учитывая ваш сценарий ниже, онможет быть не лучшим решением, но вы можете использовать утилиту типа Omit и создать новый тип из C, чтобы избежать проверки method1 (больше примеров здесь )

interface C {
  methodA(): number
  //methodB(): string,
  //methodC(): number
  //..
}
type C1 = Omit<C, "methodA">;

class A {
  methodA(): string {
    return '42'
  }
}

class B extends A implements C1 {
  methodA(): string {
    return super.methodA();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...