TypeScript如何提取对象类型中值为字符串类型的键?
TypeScript 收窄对象键为指定值类型的实现方案
通用工具类型定义
可以通过 TypeScript 的映射类型与条件类型组合实现需求,通用工具类型写法如下:
type KeysOfType<T, TargetType> = { [K in keyof T]: T[K] extends TargetType ? K : never }[keyof T]
示例使用
针对你给出的Person接口,使用方式如下:
// 先补全示例中缺失的 Address 定义 interface Address { street: string city: string } interface Person { id: number; name: string; address: Address; } // 仅保留值为字符串类型的键 type onlyKeysWithStringValues = KeysOfType<Person, string> // 最终类型等价于:type onlyKeysWithStringValues = "name"
效果验证
// 合法赋值 const validKey: onlyKeysWithStringValues = "name" // 非法赋值,会触发类型报错 const invalidKey1: onlyKeysWithStringValues = "id" const invalidKey2: onlyKeysWithStringValues = "address"
原理解释
- 首先遍历目标类型
T的所有键,对每个键对应的值类型做匹配判断:如果值类型是目标类型TargetType的子类型,就保留当前键名,否则返回never - 最后取所有返回结果的联合类型,
never类型会在联合运算中被自动过滤,最终剩下的就是值类型符合要求的键的集合。
内容的提问来源于stack exchange,提问作者Stanislav Antokhi
相关产品推荐
相关产品推荐

