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

如何在TypeScript中根据运行时参数确定并访问目标对象?

解决TypeScript中根据运行时参数访问对象的问题

最规范且类型安全的方式是创建对象映射表,以下是具体实现及其他可选方案:

1. 对象映射表(推荐)

把需要访问的对象统一存入一个映射对象,通过传入的objId作为键直接取值,TypeScript能自动做类型校验,避免拼写错误。

const obj123 = {
  id: 12,
  colour: 'blue'
}

const obj111 = {
  id: 15,
  colour: 'black'
}

// 构建对象映射,键名与目标对象名一致
const objMap = {
  obj123,
  obj111
}

// 提取对象类型,用于类型约束
type TargetObj = typeof obj123;

class Test {
  // 限制objId只能是映射表中存在的键
  getValue(objId: keyof typeof objMap): TargetObj | undefined {
    return objMap[objId];
  }
}

// 使用示例
const testInstance = new Test();
console.log(testInstance.getValue('obj123')); // { id: 12, colour: 'blue' }
console.log(testInstance.getValue('obj111')); // { id: 15, colour: 'black' }

这种方式的优势:

  • 类型安全,TS会自动检查传入的objId是否合法
  • 代码清晰,新增对象只需在objMap中添加键值对
  • 无安全风险,调试和维护成本低

2. 浏览器环境下使用window全局对象(不推荐)

如果代码运行在浏览器中,可将对象挂载到window上,但需要额外声明类型,且会污染全局作用域,仅适合小型场景:

// 扩展window类型,避免TS报错
declare global {
  interface Window {
    obj123: typeof obj123;
    obj111: typeof obj111;
  }
}

window.obj123 = obj123;
window.obj111 = obj111;

class Test {
  getValue(objId: string): typeof obj123 | undefined {
    return window[objId as keyof Window];
  }
}

3. 使用eval(强烈不推荐)

虽然能实现需求,但eval会执行任意传入的字符串,存在代码注入风险,且TS无法做类型校验,调试困难:

class Test {
  getValue(objId: string): typeof obj123 | undefined {
    try {
      return eval(objId);
    } catch (err) {
      console.error('目标对象不存在:', err);
      return undefined;
    }
  }
}

综上,优先选择对象映射表的实现方式,既符合TypeScript的类型规范,又能保证代码的安全性和可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:50:43