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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:12:03