TypeScript类公共方法访问私有方法报this为undefined如何解决
报错的核心原因是this上下文丢失。当cardShuffle方法作为独立回调被调用(例如作为接口路由处理函数)时,它的this指向不再绑定到GameController的实例,因此读取this.cardTreatment时会抛出undefined相关类型错误。另外你提供的代码片段中cardShuffle方法结尾多了一个多余的}),需要先删除避免语法报错。
解决方案
方案1:将公共方法定义为箭头函数,永久绑定类实例上下文
箭头函数的this指向定义时的上下文,不会随调用方式变化,适配绝大多数使用场景:
import { Request, Response } from 'express' class GameController { // 改为箭头函数形式 public cardShuffle = async (req: Request, res: Response): Promise<void> => { // 其他逻辑... const shuffledCards = [] // 你的业务逻辑生成的牌组 const treatment = this.cardTreatment(shuffledCards) console.log(treatment) } private cardTreatment (cards: Array<String | Number>): Array<String | Number> { return cards } } export default new GameController()
方案2:导出实例时手动绑定方法的this指向
如果不想修改方法定义,可以在导出实例时给对应方法绑定this:
class GameController { public async cardShuffle (req: Request, res: Response): Promise<void> => { // 其他逻辑... const treatment = this.cardTreatment(shuffledCards) console.log(treatment) } private cardTreatment (cards: Array<String | Number>): Array<String | Number> { return cards } } const controller = new GameController() // 手动绑定cardShuffle的this到实例 controller.cardShuffle = controller.cardShuffle.bind(controller) export default controller
方案3:调用方法时用箭头函数包裹保留上下文
如果是在注册路由等场景下调用该方法,可以直接在注册时用箭头函数包裹:
// 以Express路由注册为例 // 原来的写法(会丢失this): // app.get('/card/shuffle', gameController.cardShuffle) // 修改后的写法: app.get('/card/shuffle', (req, res) => gameController.cardShuffle(req, res))
内容的提问来源于stack exchange,提问作者scriptv9
相关产品推荐
相关产品推荐

