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

调用自定义TypeScript类方法时this属性报undefined错误如何解决?

报错原因

你遇到的报错核心是workerSearch方法调用时丢失了类实例的this绑定:
当你没有通过workerSearchObj.workerSearch()的形式直接调用方法,而是把方法单独提取出来作为回调、或者解构后调用时,严格模式下方法内部的this会指向undefined,自然找不到挂载在实例上的loadingWorkers、possibleWorkers属性。
常见的触发场景包括:将workerSearch直接作为UI事件的回调函数、在异步逻辑中单独调用该方法等。

解决方案

有三种常用的修复方式,按需选择即可:

方案1:类方法定义时用箭头函数固化this(推荐)

直接修改WorkerSearch类的workerSearch方法定义,用箭头函数替代普通方法,箭头函数的this会在定义时永久绑定到类实例,不会随调用方式变化:

export class WorkerSearch {
  private loadingWorkers: Ref<boolean>;
  private possibleWorkers: Ref<UnwrapRef<Array<TsadWorker>>>;

  constructor(loadingWorkers: Ref<boolean>, possibleWorkers: Ref<UnwrapRef<TsadWorker[]>>) {
    this.loadingWorkers = loadingWorkers;
    this.possibleWorkers = possibleWorkers;
  }

  // 改为箭头函数定义
  public workerSearch = (email: string) => {
    console.log("worker search");
    this.loadingWorkers.value = true;
    const map = new Map<string, StringFilterField>();
    map.set("email", StringFilterField.fromValue(email));
    const searchRequest = new SearchRequest(10, 0, map);
    axios
      .post(process.env.VUE_APP_BACKEND_URL + "users/workers/search", searchRequest)
      .then(response => {
        console.log("response recieved")
        this.possibleWorkers.value = response.data
        this.loadingWorkers.value = false
      })
      .catch(error => {
        defaultErrorHandler(error)
      })
  }
}

方案2:调用时手动绑定this

如果不想修改类定义,可以在传递/调用方法时手动绑定实例:

  • 作为回调传递时:
// 比如绑定给点击事件
const onSearch = workerSearchObj.workerSearch.bind(workerSearchObj)
  • 或者用匿名函数包一层调用:
// 比如点击事件回调
() => workerSearchObj.workerSearch('xxx@xx.com')

方案3:始终通过实例调用方法

保证所有调用workerSearch的位置,都是直接通过实例对象调用:workerSearchObj.workerSearch(参数),不要把方法单独提取出来使用。

内容的提问来源于stack exchange,提问作者Ace of Spade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:03