TypeScript实验性方法装饰器致类实例this指向undefined的问题修复
问题原因
你编写的装饰器在调用原控制器方法时,错误地将this绑定到了装饰器接收的scope参数(类的原型对象),而非实际的控制器实例。当Express执行路由处理方法时,原方法的this上下文被强制替换,导致无法找到实例上的generateUserResponse方法,最终抛出错误。
修复方案
修改装饰器中调用原方法的逻辑,使用当前执行上下文的this(即控制器实例)来绑定原方法的上下文,而非scope参数:
export function ValidateRequestAsync(schema: joi.ObjectSchema) { return function ( scope: unknown, methodName: string, descriptor: PropertyDescriptor ) { const originalMethod = descriptor.value; descriptor.value = async function ( req: Request, res: Response, ...args: unknown[] ) { try { await validateRequestAsync(schema, req.body); } catch (e) { if (e instanceof joi.ValidationError) { return validationErrorResponse(res, resolveValidationError(e)); } } // 用当前函数的this(控制器实例)绑定原方法的上下文 return originalMethod.apply(this, [req, res, ...args]); }; }; }
额外注意事项
如果你的路由注册方式是直接引用类的原型方法(比如router.post('/register', AuthController.register)),即使修复装饰器,this依然会是undefined——因为此时方法没有绑定到任何实例。这种情况下,你需要确保路由使用控制器实例的方法:
const authController = new AuthController(); router.post('/register', authController.register);
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

