如何在方法装饰器中管理“此”绑定?

时间:2019-08-20 16:50:02

标签: typescript decorator typescript-generics

我一直试图在装饰方法中使用 this ,但没有成功。我看到了编译器如何翻译它,实际上它没有使用正确的 this ,而是一个名为 _this 的变量,该变量在没有 this 的情况下分配绑定任何东西。

我试图将描述符。值绑定到目标,但是没有用

这是我的代码:

export function PathMethod<T>(path: string): Function {
    return (target: ServicioRest<T>, propertyKey: string, descriptor: PropertyDescriptor): void => {
        const original: Function = descriptor.value;
        descriptor.value = (entity: T): T => {
            const initialPath: string = this.path;
            if (!this.path.endsWith('/')) {
                this.path += '/';
            }
            this.path += path;
            const result: T = original(entity);
            this.path = initialPath;
            return result;
        };
    };
}

翻译是这样的:

function PathMethod(path) {
    var _this = this;
    return function (target, propertyKey, descriptor) {
        /** @type {?} */
        var original = descriptor.value;
        descriptor.value = function (entity) {
            /** @type {?} */
            var initialPath = _this.path;
            if (!_this.path.endsWith('/')) {
                _this.path += '/';
            }
            _this.path += path;
            /** @type {?} */
            var result = original(entity);
            _this.path = initialPath;
            return result;
        };
    };
}

但是实际上翻译应该是这样的:

function PathMethod(path) {
    return function (target, propertyKey, descriptor) {
        /** @type {?} */
        var original = descriptor.value;
        descriptor.value = function (entity) {
            /** @type {?} */
            var initialPath = this.path;
            if (!this.path.endsWith('/')) {
                this.path += '/';
            }
            this.path += path;
            /** @type {?} */
            var result = original(entity);
            this.path = initialPath;
            return result;
        };
    };
}

有人知道如何管理该解决方案吗?我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

如果您不想从声明上下文中捕获this,请使用常规函数而不是箭头函数。 _this ts插入用于模拟es2015箭头函数的行为。正则function表达式和声明不执行此操作。尽管=>较短,但是在两个see docs之间进行交易时,应始终考虑this的行为。

export function PathMethod<T>(path: string): Function {
    return (target: ServicioRest<T>, propertyKey: string, descriptor: PropertyDescriptor): void => {
        const original: Function = descriptor.value;
        descriptor.value = function (entity: T): T {
            const initialPath: string = this.path;
            if (!this.path.endsWith('/')) {
                this.path += '/';
            }
            this.path += path;
            const result: T = original(entity);
            this.path = initialPath;
            return result;
        };
    };
}