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

