Как получить доступ к членам класса (в данном случае к внедренным сервисам) в декораторе в машинописи - PullRequest
0 голосов
/ 25 марта 2020

Я написал простой PersonService, который выглядит следующим образом:

@Injectable()
export class PersonsService {

    constructor(
        private httpService: HttpService,
        private cacheService: CacheService,
    ) {}

    public async getPersonWithCache(id: number): Promise<Person> {
        if (await this.cacheService.hasKey(id)) {
            console.log('Hitting the cache...');
            return this.cacheService.getPerson(id);
        } else {
            const person = await this.httpService.get(`http://localhost:3000/persons/${id}`)
            .pipe(map((rawPerson: AxiosResponse<IPersonRawResponse>) => new Person().deserialize(rawPerson.data)))
            .toPromise();

            this.cacheService.setPerson(id, person);

            return person;
        }
    }

    public async getPerson(id: number): Promise<Person> {
        return this.httpService.get(`http://localhost:3000/persons/${id}`)
        .pipe(map((rawPerson: AxiosResponse<IPersonRawResponse>) => new Person().deserialize(rawPerson.data)))
        .toPromise();
    }

Я хотел бы использовать пользовательский декоратор Cacheable для функции getPerson.

Я начал писать это. не то, как это выглядит:

export function Cacheable() {
    // tslint:disable-next-line: only-arrow-functions
    return function(target: Object, key: string | symbol, descriptor: PropertyDescriptor) {
        const original = descriptor.value;
        // tslint:disable-next-line: only-arrow-functions
        descriptor.value = function(... args: any[]) {
            return original.apply(this, args);
        };
    };
}

Так что это мало что дает. Я просто пытался выяснить, как получить доступ к cacheService внутри этой функции, я никогда раньше не работал с декораторами в машинописи, и это не ясно из документации.

Я был бы очень признателен, если бы кто-то объясните мне, как это сделать.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Вы можете получить к нему доступ из функции, которую вы декорируете как this.cacheService:

descriptor.value = function (this: { cacheService: CacheService }, ...args: any[]) {
  console.log(this.cacheService);
  return original.apply(this, args);
};
0 голосов
/ 25 марта 2020

Вы пытались просто добавить его в качестве параметра на @Cachable фабрику декораторов?

Например

@Cachable(cacheService)

...