我不明白为什么会发生下一个问题。具有相同结构的代码在任何其他面向对象的语言(例如C#或Java)中都可以正常工作。 我使用Typescript编写Node.Js应用程序。
所以我有一个带有两个静态变量的类ServiceLocator
:
//ServiceLocator.ts
export class ServiceLocator {
public static dataRepository: IDataRepository = new DataRepository();
public static authService: IAuthService = new AuthService();
}
使用第一个静态变量从第二个变量进行分类。这样看起来:
//AuthService.ts
const dataRepository: IDataRepository = ServiceLocator.dataRepository;
export class AuthService implements IAuthService {
...
}
但是一旦我尝试获得authService
链接,就这样:
//AuthController.ts
const authService: IAuthService = ServiceLocator.authService;
export class AuthController {
public async signIn(request: Request, response: Response) {
..
}
..
}
我收到一个错误:
TypeError: Cannot read property 'dataRepository' of undefined
我做错了什么?
答案 0 :(得分:1)
您在这里有一个循环参考。为了构造AuthService
模块,您需要一个完全构造的ServiceLocator
类。但是,JavaScript需要一个完全构造的AuthService
模块才能构造ServiceLocator
类。切换实例化顺序仅会导致错误从ServiceModule <cint>
(到Java主义),遵循“未捕获的TypeError:未定义不是构造函数”的字样。
解决方案是简单地使依赖项变得懒惰:
//AuthService.ts
const dataRepositoryReference: IDataRepository = import('./ServiceLocator')
.then(({ ServiceLocator }) => ServiceLocator.dataRepository);
export class AuthService implements IAuthService {
public async findUserByUsername(username: UserName) {
const dataRepository = await dataRepositoryReference;
// ... snip ...
}
}