TypeScript中如何通过字符串访问对象属性并获取正确类型?
TypeScript类型安全访问带点键名的对象属性
我有以下代码:
interface Response { 'property.a': number; 'property.b': string } const response: Response = { 'property.a': 10, 'property.b': 'foo' }
我需要一种通过字符串访问对象属性的方式,必须同时满足两个要求:
- 访问存在的属性时,能获取该属性的精确类型
- 访问不存在的属性时,TypeScript会抛出类型错误
直接访问的问题
直接用方括号访问时:
response['property.a'] // 符合预期:类型为number response['property.c'] // 应该抛出类型错误,但实际没有
这种方式满足第一个要求,但无法检测不存在的属性,不满足第二个要求。
通用get函数的问题
我尝试了写一个通用的get函数:
const get = <T>(obj: T, key: keyof T) => obj[key] get(response, 'property.a') // 期望是number类型,但实际返回number | string的联合类型 get(response, 'property.c') // 符合预期:抛出类型错误
这个函数能检测不存在的属性,满足第二个要求,但返回的是对象所有属性类型的联合类型,无法得到精确的属性类型,不满足第一个要求。
寻求解决方案
有没有办法同时满足这两个要求?
补充说明:我知道TypeScript的noImplicitAny规则可以实现这个效果,但当前工作的代码库无法启用该规则,所以需要其他替代方案。
内容的提问来源于stack exchange,提问作者Luuc van der Zee
相关产品推荐
相关产品推荐

