【发布时间】:2018-09-30 09:08:54
【问题描述】:
我有一个打字稿装饰器工厂,它在控制台记录执行函数所花费的总时间、实际函数执行结果以及传递给装饰器的参数。
例如
export function performaceLog(...args: any[]) {
return (target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) => {
var msg = '';
if (args.length != 0) {
msg = args.map(arg => arg).join(' ');
}
if (descriptor === undefined) {
descriptor = Object.getOwnPropertyDescriptor(target, key);
}
if (typeof descriptor.value !== 'function') {
throw new SyntaxError('Only functions can be used with log decorators');
}
var originalMethod = descriptor.value.bind(target);
descriptor.value = function() {
var funcArgs: any = [];
for (var i = 0; i < arguments.length; i++) {
funcArgs[i - 0] = arguments[i];
}
var startTime = performance.now();
console.log(`Begin function ${key} with params (${funcArgs}) : ${msg}`);
var result = originalMethod.apply(this, funcArgs);
var endTime = performance.now();
console.log(`End function ${key}. Execution time: ${endTime - startTime} milliseconds. Return result : ${result}`);
return result;
};
return descriptor;
};
}
我将上述装饰器与一个类中存在的函数一起使用: (考虑到我的班级还有其他方法,例如 ctor、get、set 和 utils)。
class LoggerService {
@performaceLog('validate', 'message')
handleMessage(message) {
console.log(message);
return true;
};
}
函数调用如下所示:
handleMessage('decoratorValidation');
这给了我完美的输出:
Begin function handleMessage with params (decoratorValidation) : validate message
decoratorValidation
End function handleMessage. Execution time: 0.3000000142492354 milliseconds.
Return result : true
但是当我将函数handleMessage更改为支持箭头格式(ES6)时,它会抛出一个错误:
@performaceLog('validate', 'message')
handleMessage = message => {
console.log(message);
return true;
};
错误信息:
Unable to resolve signature of property decorator when called as an expression.
我在 tsconfig.json 中正确设置了所有参数。我的整个项目都支持“ES6”目标,我希望装饰器支持箭头功能。
【问题讨论】:
标签: javascript typescript ecmascript-6 decorator typescript-decorator