TypeScript 如何定义仅允许键为全大写格式的对象类型
实现全大写键名的TS对象约束类型
核心思路是利用 TypeScript 内置的 Uppercase 字符串操作类型,判断键名转为大写后是否与原键名完全一致,不一致时抛出类型错误。
类型实现
方案1:固定值类型的通用约束类型
如果你需要约束所有值为固定类型(比如示例中的string),可以直接用以下定义:
// 校验字符串是否为全大写的工具类型 type IsUppercase<S extends string> = S extends Uppercase<S> ? S : never // 约束键为全大写、值为string的对象类型,可自行修改值的类型 type OnlyUppercaseKeys = Record<IsUppercase<string>, string>
方案2:泛型动态校验工具
如果你需要保留原有对象的键、值类型推断,配合satisfies关键字使用更灵活:
type EnsureUppercaseKeys<T extends object> = { [K in keyof T as K extends string ? Uppercase<K> extends K ? K : never : K ]: T[K] }
效果验证
符合要求的代码(无报错)
// 方案1用法 const example1: OnlyUppercaseKeys = { TEST: 'any string', TEST_ME: 'any string' }; // 方案2用法 const example2 = { TEST: 'any string', TEST_ME: 'any string' } satisfies EnsureUppercaseKeys<typeof example2>
不符合要求的代码(触发报错)
// 方案1用法 const badExample1: OnlyUppercaseKeys = { Test: 'any string', 'test_me': 'any string' }; // 报错:Test、test_me 不属于合法键类型 // 方案2用法 const badExample2 = { Test: 'any string', 'test_me': 'any string' } satisfies EnsureUppercaseKeys<typeof badExample2> // 报错:不满足类型约束
补充说明
如果需要同时过滤非字符串类型的键(比如数字、Symbol),可以调整工具类型的判断逻辑,排除非字符串类型的键即可。
内容的提问来源于stack exchange,提问作者Buszmen
相关产品推荐
相关产品推荐

