Проблема строгого ввода с универсальными типами в typescript

#javascript #angular #typescript

#javascript #angular #typescript

Вопрос:

Я пытаюсь научиться строгому набору текста в Typescript.

Я определил эти классы:

  export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
  private param: TParam;

  setInitParams(init: TParam): void {
   ...
  }

  getInitParams(): TParam {
   ....
  }
}

export class MyClass extends MyAbstractClass<AParamType> {
 private param: AParamType;

 ...
}
 

Проблема в том, что я получаю сообщение об ошибке » Класс ‘MyClass’ неправильно расширяет базовый класс ‘MyAbstractClass’.
Типы имеют отдельные объявления частного свойства ‘param’. »

Я не понимаю, почему я получаю эту ошибку, потому что тип AParamType правильно расширяет MyParamBaseType

Может кто-нибудь мне помочь? Спасибо за вашу помощь.

Ответ №1:

private Ключевое слово — это просто проверенное время компиляции. Это означает, что поле param будет сохранено во время выполнения в экземпляре класса. MyAbstractClass объявляет его закрытым элементом, поэтому, если MyClass бы было разрешено повторно param объявить поле, это привело бы к доступу к тому же полю, названному param в экземпляре, во время выполнения, нарушая конфиденциальность.

Вы можете использовать поля частного класса ES (с # ). Они обеспечивают жесткую конфиденциальность даже во время выполнения, и конфликты имен в подклассе не являются проблемой, поскольку каждое объявленное поле отличается, даже если они имеют одно и то же имя:

 type MyParamBaseType = {}
export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
  #param!: TParam;

  setInitParams(init: TParam): void {

  }

  getInitParams(): TParam {
    return this.#param;
  }
}

type AParamType = {}
export class MyClass extends MyAbstractClass<AParamType> {
  #param!: AParamType;

}
 

Ссылка на игровую площадку

Или, если вы хотите получить доступ к тому же полю из базового класса, вы можете рассмотреть protected вместо этого:

  type MyParamBaseType = {}
 export abstract class MyAbstractClass<TParam extends MyParamBaseType> {
  protected param!: TParam;

  setInitParams(init: TParam): void {

  }

  getInitParams(): TParam {
    return this.param
  }
}

type AParamType = {}
export class MyClass extends MyAbstractClass<AParamType> {
 protected param!: AParamType;

}
 

Ссылка на игровую площадку

Комментарии:

1. Большое спасибо, я пытался получить доступ к той же переменной…