Как вывести тип параметра конструктора внутри абстрактного класса - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть метод в базовом абстрактном классе, который должен возвращать тот же тип параметра конструктора. Я не уверен, возможно ли это или даже имеет ли это смысл (возможно, я упускаю что-то очевидное).

Вот упрощенная версия того, что я пытаюсь сделать:

abstract class ValueObject {
  private value: any;

  constructor(value: any) {
    this.value = value;
  }

  getValue() {
    return this.value;
  }
}

class UserName extends ValueObject {
  constructor(name: string) {
    super(name);
  }
}

new UserName('some name').getValue(); // This has a type 'any', I want it to be the same type as I called super() with, in this case 'string', but could be any other type for different subclasses 

Для меня это имеет смысл, поскольку я не могу на самом деле создать экземпляр абстрактного класса, поэтому мне нужен способ передачи типа, возвращаемого методом.

Возможно ли это? Имеет ли это смысл вообще? Должен ли я go для совершенно другого подхода?

Спасибо!

1 Ответ

1 голос
/ 25 апреля 2020

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

abstract class ValueObject<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue() : T {
    return this.value;
  }
}

class UserName extends ValueObject<string> {
  constructor(name: string) {
    super(name);
  }
}

const result = new UserName('some name').getValue();
console.log(result);
console.log(typeof(result));
...