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 ...
  }
}

Relaterte artikler