如何将泛型对象的键K约束为仅对应字符串类型值的键?
如何将泛型键K约束为仅指向对象T中值为字符串类型的键?
你可以通过条件类型筛选或者TypeScript 4.9+支持的where子句实现这个约束,确保传入的键K对应的对象值一定是字符串类型,让函数返回值能安全推断为string类型。
原始代码的问题
你的初始代码仅把K约束为keyof T,但没限制T[K]必须是string类型,TypeScript无法保证obj[key]能赋值给string,因此报错。
function extractStringValue<T extends object, K extends keyof T>(obj: T, key: K): string { return obj[key]; // 错误:类型'T[K]'无法赋值给类型'string' }
解决方案1:条件类型筛选键(兼容所有TS版本)
利用条件类型和索引访问类型,从keyof T里筛选出对应值为string的键:
function extractStringValue<T extends object, K extends keyof T & { [P in keyof T]: T[P] extends string ? P : never }[keyof T]>( obj: T, key: K ): string { return obj[key]; // 类型安全,此时T[K]必然是string }
也可以用TypeScript内置的Extract工具类型简化:
type StringKeys<T> = Extract<keyof T, { [P in keyof T]: T[P] extends string ? P : never }[keyof T]>; function extractStringValue<T extends object, K extends StringKeys<T>>(obj: T, key: K): string { return obj[key]; }
解决方案2:where子句(TS 4.9+)
TypeScript 4.9及以上支持where子句,写法更直观:
function extractStringValue<T extends object, K extends keyof T>(obj: T, key: K): string where T[K] extends string { return obj[key]; }
测试验证
按你的期望用法测试,符合预期:
const myObj = { stringKey: "hi", boolKey: false } const stringVal = extractStringValue(myObj, "stringKey"); // 正常运行,返回string类型 const stringVal2 = extractStringValue(myObj, "boolKey"); // 触发类型错误
内容的提问来源于stack exchange,提问作者sookie
相关产品推荐
相关产品推荐

