TypeScript实现查询interface属性的函数返回对应类型而非全量union type
精准匹配属性类型的查询函数实现
问题核心原因
之前的实现返回类型变成所有属性的联合类型,根本原因是没在入参的data结构和传入的查询key之间建立类型关联。如果把key的类型直接宽泛写成string,TypeScript没法识别你具体传了哪个字面量当查询键,只能把data所有属性的类型取并集当返回值,自然拿不到单个目标属性的准确类型。
可复用的实现方案
给函数加两个联动的泛型参数,把key的类型严格限制为data自带的合法键,返回值直接映射为对应键的属性类型就行:
// 参考的接口定义 interface User { id: number; name: string; age: number; isActive: boolean; } // 带精准类型推导的属性查询函数 function getProperty<T extends object, K extends keyof T>(data: T, key: K): T[K] { return data[key]; }
常见写错的版本提醒
很多人写的时候会漏抽独立的key泛型,虽然看起来做了key的合法性约束,实际还是会返回联合类型:
// 错误示例:返回值还是全属性的联合类型 function getProperty<T extends object>(data: T, key: keyof T): T[keyof T] { return data[key]; }
这个写法的问题是没有把「调用时传入的具体key字面量」作为独立泛型保留下来,key的类型是keyof T的全集,不是用户实际传入的"name"这类精确值,TypeScript自然没法对应到具体的属性类型。
推导效果说明
- 调用
getProperty(userInfo, "name")时,TypeScript会自动把泛型K收窄为字面量类型"name",返回值精准匹配string类型,不会混入其他属性的联合类型 - 要是传了data里根本不存在的key,类型检查会直接报错,不会放过非法的属性查询
- 后续如果要支持多层嵌套属性的查询,只需要在这个泛型逻辑基础上,递归扩展key和属性路径的类型映射关系就能实现,核心逻辑不用变。
内容的提问来源于stack exchange,提问作者marius
相关产品推荐
相关产品推荐

