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

如何修复嵌套递归函数中的TypeScript this指向问题

修复方案:显式声明this类型,保留原上下文传递逻辑

要解决TypeScript对this参数的类型检查问题,同时保留原函数的递归遍历逻辑,你可以通过给内部函数显式声明this类型的方式消除@ts-ignore,无需修改原函数的核心逻辑。

修改后的完整代码

getProperty(object: Record<string, unknown>, key: string) {
  // 显式声明this的合法类型:可以是任意键值对对象或undefined
  function iter(this: Record<string, unknown> | undefined, a: string) {
    const item = this ? this[a] : a;
    
    if (this && a === key) {
      // 类型断言:根据你的实际场景调整,这里假设目标值是string
      result.push(item as string);
    }

    if (Array.isArray(item)) {
      return item.forEach(iter);
    }

    if (item !== null && typeof item === 'object') {
      return Object.keys(item as Record<string, unknown>).forEach(iter, item);
    }
  }

  const result: string[] = [];
  Object.keys(object).forEach(iter, object);
  return result;
}

关键修改点说明

  1. 给iter函数声明this类型
    TypeScript允许在函数的第一个参数位置声明this的类型(该参数仅用于类型检查,不会被实际传递),这里指定this: Record<string, unknown> | undefined,明确告知编译器this可以是任意键值对象或undefined,直接解决原代码中this类型不明确的错误。

  2. 优化参数类型
    将object的类型从空对象{}改为Record<string, unknown>,更准确描述“可遍历键值对的对象”,避免TypeScript对属性访问的类型报错。

  3. 类型断言处理值类型
    由于item的类型是unknown,需要通过as string断言为你期望的类型(如果你的场景中目标值不是string,可改为对应类型,比如unknown[])。

为什么之前的尝试失效?

  • 箭头函数:箭头函数的this是词法作用域绑定的,会固定为外层getProperty函数的this,无法接收forEach传递的动态上下文,导致遍历逻辑完全错误。
  • bind绑定:bind会固定函数的this值,而原函数中每次forEach传递的this是不同的(初始是根对象,后续是子对象),固定后会破坏递归遍历的上下文传递,导致无法正确遍历子结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:30:33