Запретить публичной функции машинописного текста вызывать частную функцию

#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 готово!