如何在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
相关产品推荐
相关产品推荐

