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

TypeScript方法装饰器中originalMethod.apply参数为何为undefined?

TypeScript方法装饰器参数传递问题排查与解决

这不是TypeScript的bug,问题出在装饰器内部对originalMethod.apply的参数传递逻辑上。

错误示例(导致参数undefined的写法)

function FaultyDecorator() {
  return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function() {
      // 遗漏了调用时传入的参数
      originalMethod.apply(this);
    };
    return descriptor;
  };
}

class Demo {
  @FaultyDecorator()
  printArg(arg: string) {
    console.log("原方法参数:", arg); // 输出undefined
  }
}

const demo = new Demo();
demo.printArg("测试参数");

正确实现(传递参数的写法)

要解决这个问题,需要将装饰器重写后的方法接收到的所有参数,传递给originalMethod.apply的第二个参数(参数数组):

function WorkingDecorator() {
  return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args: any[]) {
      // 显式传递参数数组给原方法
      originalMethod.apply(this, args);
    };
    return descriptor;
  };
}

class Demo {
  @WorkingDecorator()
  printArg(arg: string) {
    console.log("原方法参数:", arg); // 输出测试参数
  }
}

const demo = new Demo();
demo.printArg("测试参数");

核心原因

Function.prototype.apply的第二个参数是原方法执行时的参数列表,必须显式传递。如果省略这个参数,原方法的形参就会被赋值为undefined。装饰器重写方法时,必须收集调用时传入的所有参数(通过剩余参数...args或arguments对象),并传递给原方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:49:52