如何在TypeScript中定义强制键名为驼峰式(camelCase)的类型或接口?
如何用TypeScript强制对象键为驼峰式格式
当然可以实现这个需求!TypeScript的模板字面量类型和递归类型组合起来,就能帮你严格约束对象的键必须遵循驼峰式(camelCase)命名规则。下面我给你详细拆解实现方案:
步骤1:定义驼峰式校验类型
首先我们需要一个类型来判断字符串是否符合驼峰式规则——首字母小写、不含下划线等分隔符,后续单词首字母大写:
// 校验字符串是否为驼峰式的类型 type IsCamelCase<S extends string> = // 排除包含下划线的字符串 S extends `${string}_${string}` ? never : // 首字母必须是小写,提取剩余部分继续检查 S extends `${Lowercase<string>}${infer Rest}` ? // 如果剩余部分以大写字母开头,递归检查后续字符 Rest extends `${Uppercase<string>}${infer Rest2}` ? IsCamelCase<Rest2> : true : never;
步骤2:构建约束对象类型
接下来用这个校验类型来创建一个通用的对象类型,只允许符合驼峰规则的键:
// 约束键为驼峰式的对象类型 type CamelCaseObject<Value> = { [K in string as IsCamelCase<K> extends true ? K : never]: Value; };
实际使用示例
现在你就可以像这样使用这个类型,不符合驼峰规则的键会直接在编译时报错:
// 假设你的值类型是这个 type OtherType = string; // 合法的对象示例 const validObject: CamelCaseObject<OtherType> = { camelCaseKey: "这是合法的", userProfile: "也是合法的", itemId123: "带数字也没问题" }; validObject.camelCaseKey; // ✅ 正常访问 // 不合法的情况(会报错) const invalidObject: CamelCaseObject<OtherType> = { not_camel_case: "包含下划线,不合法", // ❌ 类型报错 CamelCase: "首字母大写,不合法", // ❌ 类型报错 hyphen-case: "连字符分隔,不合法" // ❌ 类型报错 };
补充说明
- 这个方案是编译时校验,只能约束静态定义的键;如果是动态生成的键,需要在代码逻辑里额外处理。
- 如果你想用接口实现,由于TypeScript接口的索引签名不支持这种条件约束,所以用类型别名(
type)的方式是更合适的选择。
内容的提问来源于stack exchange,提问作者Valentin Vignal
相关产品推荐
相关产品推荐

