Как получить доступ ко всем аргументам метода в машинописи? - PullRequest
0 голосов
/ 20 февраля 2019

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

interface MyServiceInterface {
    doBar(otherParam: number): string;

    doFoo(param1: string, param2: number): string;
}

class MyServiceClass implements MyServiceInterface {

    doFoo(param1: string, param2: number): string {
        throw new Error("I SHOULD BE CAUGHT");
    }

    doBar(otherParam: number): string {
        throw new Error("I SHOULD BE CAUGHT");
    }
}

class MyDecorator implements MyServiceInterface {
    constructor(private service: MyServiceInterface) {
    }

    public doFoo(param1: string, param2: number): string {
        try {
            return this.service.doFoo(param1, param2);
        } catch (e) {
            return "THIS SPECIAL CASE IS NOW RESOLVED";
        }
    }

    public doBar(otherParam: number): string {
        try {
            return this.service.doBar(otherParam);
        } catch (e) {
            return "THIS SPECIAL CASE IS NOW RESOLVED";
        }
    }
}

const instance = new MyDecorator(new MyServiceClass());

console.log([
    instance.doBar(1),
    instance.doFoo("biz", 2),
].join("\n"));

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

Как мне этого добиться?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете сохранить функцию как переменную и сохранить свои аргументы в массиве.Тогда вы можете использовать function.apply примерно так:

class MyDecorator implements MyServiceInterface {
    constructor(private service: MyServiceInterface) {
    }

    public doFoo(param1: string, param2: number): string {
        const args = [param1, param2];

        return this.handleErrorCase(this.service.doFoo, args);
    }

    public doBar(otherParam: number): string {
        const args = [otherParam];

        return this.handleErrorCase(this.service.doBar, args);
    }

    private handleErrorCase<T>(fn: any, args: any[]): string {
        try {
            return fn.apply(this.service, args) as string;
        } catch (e) {
            return "THIS SPECIAL CASE IS NOW RESOLVED";
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...