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

如何在TypeScript泛型接口中推断函数参数类型?

如何让TypeScript泛型接口根据key推断对应value类型?

你当前的泛型接口ObjectKey<T>无法实现根据指定key推断对应属性类型的核心问题在于:接口只约束了key属于keyof T,但没有把具体的key值和doSomethingWithKey的参数类型做绑定,导致TypeScript只能返回所有属性类型的联合类型。

解决方案:新增绑定具体key的泛型参数

通过给接口添加第二个泛型参数K,让它约束为keyof T,就能把key的具体类型和value的类型做关联:

interface ObjectKey<T extends {}, K extends keyof T> {
  key: K;
  doSomethingWithKey: (value: T[K]) => void;
}

使用示例

不需要手动指定K,TypeScript会自动根据key的取值推断对应类型:

interface User {
  name: string;
  age: number;
  archived: boolean;
}

// 自动推断value为string类型
const nameKey: ObjectKey<User> = {
  key: 'name',
  doSomethingWithKey: (value) => console.log(value.toUpperCase()) // 可直接调用string方法
};

// 自动推断value为number类型
const ageKey: ObjectKey<User> = {
  key: 'age',
  doSomethingWithKey: (value) => console.log(value.toFixed(1)) // 可直接调用number方法
};

更简洁的写法:工厂函数辅助推断

如果不想每次都写泛型参数,还可以封装一个工厂函数让推断更自动:

function createObjectKey<T extends {}, K extends keyof T>(obj: ObjectKey<T, K>) {
  return obj;
}

// 无需指定泛型,TypeScript自动推断T为User,value为boolean
const archivedKey = createObjectKey({
  key: 'archived',
  doSomethingWithKey: (value) => console.log(value ? '已归档' : '未归档')
});

原理说明

新增泛型K后,key的类型被固定为具体的某个属性名(比如'name'),而doSomethingWithKey的参数类型则明确指向T[K](即User['name']对应的string),从而实现了key和value类型的一一绑定,解决了联合类型的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:10:53