#javascript #typescript #oop #monkeypatching
Вопрос:
У меня есть этот урок:
export class ResourceFactory {
AlgoliaAppId = "AlgoliaAppId";
// ...
private resetParams() {
this.AlgoliaAppId = "AlgoliaAppId";
// ...
}
public initTemplate(objectName, directiveArgs): Template {
this.resetParams(); // <-- Can I, in any possible way, prevent this line from running?
this.AlgoliaAppId = `${this.AlgoliaAppId}${objectName}`;
// ... [long function content which I don't want to duplicate]
}
}
Я пытаюсь расширить ResourceFactory
класс: я хочу изменить имя resetParams
AlgoliaAppId и запретить запуск. (Я не могу редактировать исходный класс).
Есть ли какой-либо способ переопределить resetParams
, даже если он является частным, или, по крайней мере, каким-то образом исправить метод initTemplate, чтобы он не запускал строку this.resetParams
?
Ответ №1:
Нет (чистого) способа переопределить private
метод из базового класса, над которым у вас нет контроля. Я попробовал немного увеличить модуль, чтобы посмотреть, смогу ли я изменить модификатор protected
, но мне не очень повезло; TypeScript, похоже, хочет, чтобы все перегрузки имели один и тот же модификатор.
Тем не менее, я смог исправить прототип после объявления класса, чтобы взломать перегрузку, за счет включения @ts-expect-error
комментария. Похоже, это путь наименьшего сопротивления для борьбы с компилятором. Вот как будет выглядеть пример подкласса:
class Example extends ResourceFactory {
AlgoliaAppId = "CustomName";
}
// @ts-expect-error
Example.prototype.resetParams = function resetParams() {
// your implementation
}
Вот также ссылка на игровую площадку.
Комментарии:
1. Спасибо, но, как я подчеркнул в вопросе, я не могу изменить суперкласс.
2. Извините, я совершенно неправильно это понял. Нет (чистого) способа переопределить частный метод из базового класса, над которым у вас нет контроля. Я попробовал немного увеличить модуль, чтобы посмотреть, смогу ли я изменить модификатор на защищенный, и это тоже не сработало. Тем не менее, я смог исправить прототип после объявления класса, чтобы взломать перегрузку, за счет включения
// @ts-expect-error
комментария. Похоже, это путь наименьшего сопротивления для борьбы с компилятором.3. @Infinity Вот ссылка на игровую площадку . Дайте мне знать, если это сработает, и я обновлю свой ответ.
4. Конечно. Не могли бы вы, пожалуйста, обновить свой ответ? 🙂
5. @Infinity готово!