我一直试图在装饰方法中使用 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;
};
};
}
有人知道如何管理该解决方案吗?我的代码有什么问题吗?
答案 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;
};
};
}