如何将TypeScript泛型类型的键约束为仅字符串类型?
实现仅允许字符串键的泛型类型
OnlyStringKey<T> 要满足仅接受所有键为字符串类型的对象,可通过泛型约束结合条件类型实现,具体代码如下:
type OnlyStringKey<T extends { [K in keyof T]: K extends string ? T[K] : never }> = T;
原理说明
泛型约束部分会遍历传入类型T的所有键K:
- 若
K是字符串类型,保留原属性的类型T[K]; - 若
K是数字或Symbol类型,将对应属性的类型强制设为never。
当T包含非字符串键时,原类型的对应属性类型(比如string)无法兼容never类型,因此T不满足泛型约束,直接触发编译错误。只有当所有键都是字符串类型时,约束中的类型与T完全匹配,泛型才会正常通过。
验证示例
// ✅ 编译通过,所有键均为字符串 let x: OnlyStringKey<{whatEverJustString1: 1, whatEverJustString2: '' }>; // ❌ 编译报错,数字键2不满足约束 let y: OnlyStringKey<{whatEverJustString1: 1, 2: '' }>; // ❌ 编译报错,Symbol键不满足约束 let z: OnlyStringKey<{whatEverJustString1: 1, [Symbol.search]: '' }>;
内容的提问来源于stack exchange,提问作者weiceshi
相关产品推荐
相关产品推荐

