#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. Большое спасибо, я пытался получить доступ к той же переменной…