javascript - Typescript: problem med udefinert statisk variabel
Jeg kan ikke forstå hvorfor neste problem oppstår. Kode med samme struktur fungerer fint i andre objektorienterte språk som C# eller Java. Jeg skriver en Node.Js-app med Typescript.
Så jeg har en klasse ServiceLocator med to statiske variabler:
//ServiceLocator.ts
export class ServiceLocator {
public static dataRepository: IDataRepository = new DataRepository();
public static authService: IAuthService = new AuthService();
}
Klasse fra den andre med en variabel ved å bruke den første statiske variabelen. Slik ser det ut:
//AuthService.ts
const dataRepository: IDataRepository = ServiceLocator.dataRepository;
export class AuthService implements IAuthService {
...
}
Men når jeg prøver å få authService-lenken på denne måten:
//AuthController.ts
const authService: IAuthService = ServiceLocator.authService;
export class AuthController {
public async signIn(request: Request, response: Response) {
..
}
..
}
Jeg fikk en feil:
TypeError: Cannot read property 'dataRepository' of undefined
Hva gjør jeg galt?
Svar #1
Du har en sirkulær referanse her. For å kunne konstruere AuthService modul trenger du en fullstendig konstruert ServiceLocator-klasse. Men JavaScript trenger en fullstendig konstruert AuthService-modul for å kunne konstruere ServiceLocator-klassen. Å bytte rekkefølgen på instansieringen vil bare resultere i en feil fra ServiceModule <cint> (for å bruke et Java-uttrykk) langs linjene av "Uncaught TypeError: undefined is not a constructor".
Løsningen er rett og slett å gjøre avhengigheten lat:
//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 ...
}
}
