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

如何将泛型对象的键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:02:44