TypeScript-dekoratører, hente konstruktørargumenttyper og injeksjon


Anta at du har en klasse som dette med Router-dekortøren festet til den.

@Router
class AuthRouter {

    constructor(private cacheService: CacheService) {}
}

Hvordan får jeg konstruktørens parametertyper fra innenfor Router-dekoren? Anta at vi har lagret en singleton av CacheService som vi kan få tilgang til hvis vi kjente klassenavnet "CacheService".

function Router(target) {

    // somehow get the constructor class name
    const dependencyNames = 'CacheService' // an array if multiple args in constructor

    // getSingleton is a function that will retrieve
    // a singleton of the requested class / object
    return new target(getSingleton(dependencyNames))
}

Så når vi bruker AuthRouter, vil den allerede ha CacheService injisert i seg.

Svar #1

import 'reflect-metadata'

function Router(target) {
    const types = Reflect.getMetadata('design:paramtypes', target);
    // return a modified constructor
}

Merk at du kaller getMetadata uten en tredje parameter. types vil være et array av konstruktørparametrene. types[0].name === 'CacheService' i ditt tilfelle.

Relaterte artikler