You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
  };
}

逻辑说明

  1. 每个装饰器都会先保存原函数的引用(第一次是addOne本身,第二次是multiply包装后的函数)
  2. 包装函数通过...args接收原函数的所有参数,用apply保证原函数的this上下文正确
  3. 先执行原函数拿到结果,再执行当前装饰器的计算逻辑
  4. 装饰器执行顺序:@multiply(2)先处理,把addOne变成「输入值+1后乘2」;@subtract(1)再处理,变成「输入值+1→乘2→减1」
  5. 调用addOne(2)的完整流程:2+1=3 → 3*2=6 → 6-1=5,最终输出5

内容的提问来源于stack exchange,提问作者Arash Yazdani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:15:34