如何在TypeScript中通过装饰器获取函数参数?
解决TypeScript装饰器中获取函数参数并正确链式调用的问题
你的代码目前存在两个核心问题:
- 装饰器直接把
descriptor.value替换成了固定计算值,完全丢掉了原函数逻辑,也没处理函数的入参 - 装饰器没有实现链式调用的能力,无法基于原函数的结果做后续加工
修正思路
装饰器需要包装原函数,而不是直接替换成固定值。在包装函数里,你可以通过...args获取原函数的所有参数,先执行原函数拿到结果,再应用装饰器的计算逻辑。同时要注意:TypeScript中装饰器是从下往上执行的(离函数最近的装饰器先生效)。
修正后的代码
class CalcClass { @subtract(1) @multiply(2) addOne(number: number) { return number + 1; } } console.log(new CalcClass().addOne(2)); // 输出 5 function subtract(subtractNum: number) { return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { // 保存原函数(可能是上一个装饰器包装后的函数) const originalMethod = descriptor.value; // 替换为包装后的函数 descriptor.value = function (...args: any[]) { // 调用原函数并传入参数,绑定this上下文 const result = originalMethod.apply(this, args); // 应用当前装饰器的逻辑 return result - subtractNum; }; return descriptor; }; } function multiply(multiplyNum: number) { return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; descriptor.value = function (...args: any[]) { const result = originalMethod.apply(this, args); return result * multiplyNum; }; return descriptor; }; }
逻辑说明
- 每个装饰器都会先保存原函数的引用(第一次是
addOne本身,第二次是multiply包装后的函数) - 包装函数通过
...args接收原函数的所有参数,用apply保证原函数的this上下文正确 - 先执行原函数拿到结果,再执行当前装饰器的计算逻辑
- 装饰器执行顺序:
@multiply(2)先处理,把addOne变成「输入值+1后乘2」;@subtract(1)再处理,变成「输入值+1→乘2→减1」 - 调用
addOne(2)的完整流程:2+1=3→3*2=6→6-1=5,最终输出5
内容的提问来源于stack exchange,提问作者Arash Yazdani
相关产品推荐
相关产品推荐

