Как создать экземпляр класса без «нового» ключевого слова - PullRequest
1 голос
/ 08 июня 2019

Этот проект является проектом NodeJS с TypeScript.

Я хочу создать экземпляр класса App.Но, если я использую ключевое слово new, мне нужно передать параметр конструктора.

Проблема в том, что параметр конструктора должен передаваться с внедрением зависимости.Поэтому я не могу использовать ключевое слово new для создания экземпляра.

// Express
import { application as app } from 'express';

// Controllers
import { UserController } from './controllers/user.controller'

export class App {
  constructor(userController: UserController) {
    console.log("App is running");
    console.log("UserController url path is : ", userController.getUrlPath);

    this.run();
  }

  run(): void {
    app.listen(3000, function () {
      console.log('App is running on port 3000!');
    });
  }

  check(): void {
    console.log("working well");
  }
}

const appInstance: App = <App>Object.create(App.prototype); // it is not creating

console.log( appInstance.check() ); // ==> 'undefined'

1 Ответ

0 голосов
/ 08 июня 2019

Это противоречит самой концепции использования классов
Если вам нужно избежать прохождения конкретного UserController для целей тестирования, вы можете использовать некоторую форму макета.
Другой вариант - использовать переменную типа any:

const app = new App({} as any);

В зависимости от вашей конфигурации tsconfig.json, она должна работать (очевидно, вы не сможете получить доступ ни к одной из функций / полей объекта UserController, но конструкция App должна работать просто отлично.
Последний вариант (я мог бы подумать, по крайней мере) использует функцию установки для UserController:

export class App {
 private _userController: UserController;
 get userController(): UserController {
  return this._userController;
 }
 set userController(ctrl: UserController) {
  this._userController = ctrl;
 }
}

И, таким образом, после настройки полной инфраструктуры DI вы можете использовать App.userController = SOME_USER_CONTROLLER_FROM_DI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...