@zlodiak

Как сочетаются наследование и дженерики?

Я знаю что такое extends и знаю что такое generics, но иногда вижу код, в котором они используются вместе и это непонятно. Выглядит он примерно так:

class A extends B<string> {}

Даже не знаю по каким словам гуглить чтобы понять что означает такая запись.

Объясните пожалуйста в общих чертах смысл подобной записи или посоветуйте что именно почитать. Хоть бы даже на английском.
  • Вопрос задан
  • 673 просмотра
Решения вопроса 1
sarapinit
@sarapinit
Точу водой камень
Вот например:
class Result<T>{
  public readonly result;
  constructor(result: T){
    this.result = result;
  }  
}

class NumberResult extends Result<number>{
  constructor(result: number){
    super(result);
  }

  public ResultPlusOne(){
    return this.result + 1;
  }
}


Result<T> - это открытый дженерик, то есть в будущем на месте T должен быть указан другой\типы или типы для того чтобы создавать экземпляры класса.
Если мы захотим, например, на место Т поставить number и создать экземпляр класса
let result = new Result<number>(42)
то компилятор для этого создаст закрытый дженерик который будет выглядеть примерно так, но вы его нигде не увидите:
class Result{
  public readonly result;
  constructor(result: number){
    this.result = result;
  }  
}


Запись class NumberResult extends Result<number>
Означает наследование от такого класса Result в котором на место T уже подставлен конкретный тип
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Классы в TypeScript могут быть дженериками, то есть параметризованы неким типом (или даже несколькими типами). При наследовании нужно передавать такой параметр явно, чтоб TypeScript знал, что подставить на место обобщенного типа.
class Base<T> {
  protected val: T;
}

class A extends Base<string> {
  methodA(): string {
    return this.val; // Ok, так как здесь val имеет тип string
  }
}

class B extends Base<number> {
  methodB(): number {
    return this.val; // тоже ok, так как здесь val имеет тип number
  }
}
Ответ написан
Ni55aN
@Ni55aN
дженерик в этом лучае ничем не отличается как и в new B<string>()
Ответ написан
Комментировать
mmmaaak
@mmmaaak
Обычное джаваскриптовое наследование, че тут еще искать, сам же сказал, что знаешь, что такое extends
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы