You need to enable JavaScript to run this app. TypeScript实现查询interface属性的函数返回对应类型而非全量union type
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 11:15:04