路由直接绑定handle方法时createUserUseCase为null的原因咨询
问题原因:this上下文绑定丢失
核心问题是JavaScript/TypeScript中的方法this绑定规则导致的:
直接传createUserFactory().handle失效的原因
当你把createUserFactory().handle作为回调函数传给userRouter.post时,你只是把handle方法本身的引用传递了过去,此时这个方法的this上下文不再指向原来的CreateUserController实例。在TypeScript默认启用的严格模式下,这种情况里this会变成undefined,导致你在handle方法中访问this.createUserUseCase时,得到的就是undefined(表现为你看到的null)。
箭头函数包裹能正常运行的原因
箭头函数不会绑定自己的this,它会继承外层作用域的this。更关键的是,在箭头函数内部你是通过createUserFactory().handle(req, res)的形式调用方法——也就是通过controller实例来调用handle方法,此时根据JavaScript的调用规则,方法内部的this会自动指向调用它的实例,所以能正确访问到createUserUseCase。
两种可行的解决方案
方案1:在构造函数中手动绑定this
修改CreateUserController的构造函数,把handle方法的this绑定到实例:
class CreateUserController { private createUserUseCase: CreateUserUseCase; constructor(useCase: CreateUserUseCase) { this.createUserUseCase = useCase; // 将handle方法的this绑定到当前实例 this.handle = this.handle.bind(this); } handle(req: Request, res: Response) { // 这里的this会始终指向CreateUserController实例 this.createUserUseCase.execute(/* ... */); } }
方案2:使用类字段箭头函数
把handle定义为类字段箭头函数,它会自动绑定实例的this:
class CreateUserController { private createUserUseCase: CreateUserUseCase; constructor(useCase: CreateUserUseCase) { this.createUserUseCase = useCase; } // 箭头函数自动绑定this到当前实例 handle = (req: Request, res: Response) => { this.createUserUseCase.execute(/* ... */); } }
内容的提问来源于stack exchange,提问作者Guilherme Kauã
相关产品推荐
相关产品推荐

