Как установить одно свойство перед запуском конструктора typescript

#javascript #typescript #constructor

#javascript #typescript #конструктор

Вопрос:

Некоторые библиотеки и фреймворки JavaScript предоставляют возможность ранней привязки свойств, так что разработчики имеют возможность использовать эти связанные свойства даже в конструкторах. Мне нужно сделать тот же взлом для тестов.

Основная проблема заключается в том, что это свойство bind используется в конструкторе, и я не могу создать экземпляр контроллера для покрытия тестами.

Конструктор класса не должен быть изменен (добавление новых параметров или что-то в этом роде), потому что логика создания класса управляется фреймворком, и я не хочу добавлять какие-либо необязательные параметры в конструктор класса.

Я пробовал что-то подобное. Не повезло, потому что я чего-то не хватает.

 function createMyController(bindProperty, ...controllerArgs) {
        let myController = Object.create(MyController);
        myController.bindProperty = bindProperty;
        MyController.constructor.apply(myController, [...controllerArgs]);
        // post creation assignments or modifications
        return myController;
    }
  

Ответ №1:

Конструкторы Typescript допускают использование свойств параметров, которые делают именно это.

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

1. Спасибо за ответ, но, боюсь, я не смогу изменить параметры конструктора

Ответ №2:

Этот тип привязки называется предварительной привязкой, и он использовался, например, в angularjs (angular 1). Идея, лежащая в основе этой предварительной привязки, заключается в инициализации некоторых свойств перед вызовом функции конструктора.

Это можно решить, сначала инициировав объект некоторого типа. Затем привязка всех необходимых значений. И, наконец, вызов самого конструктора.

 function createMyController(bindProperty, ...controllerArgs) {
    let myController = Object.create(MyController.prototype);
    myController.bindProperty = bindProperty;
    MyController.call(myController, ...controllerArgs);
    // post creation assignments or modifications
    return myController;
}