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

TypeScript中如何定义仅含枚举单个键的对象类型

TypeScript 枚举单键对象类型定义

全量键的常规写法

要指定对象包含枚举中的所有键,可直接使用映射类型遍历枚举所有键,示例如下:

enum Sizes {
  Small = 'S',
  Medium = 'M',
  Large = 'L',
  ExtraLarge = 'XL',
}

/**
 * 👇️ keys类型为 {Small: any; Medium: any; Large: any; ExtraLarge: any}
 */
let keys: { [key in keyof typeof Sizes]: any };

单键对象类型实现

如果需要定义仅包含枚举中某一个键的对象(即类型为{ Small: any }、{Medium: any}等单键类型之一,不允许同时包含多个枚举键),可以通过「映射类型生成单键成员 + 索引取联合」的方式实现:

// 先构造遍历所有枚举键、每个键对应独立单键对象的类型,再通过索引取出所有单键类型组成联合
type SingleEnumKey = {
  [K in keyof typeof Sizes]: { [P in K]: any }
}[keyof typeof Sizes];

/**
 * 👇️ key的类型为 {Small: any} | {Medium: any} | {Large: any} | {ExtraLarge: any}
 * 仅允许传入单个键的对象,传入多键对象会直接报类型错误
 */
let key: SingleEnumKey;

// 合法用例
key = { Small: 'test' };
key = { Medium: 123 };

// 非法用例(TS报错:不能同时包含多个枚举键)
// key = { Small: 's', Medium: 'm' };

实现原理

  1. 外层[K in keyof typeof Sizes]会遍历枚举的每一个键,为每个键K生成一个仅包含当前键的对象类型{ [P in K]: any },这一步得到的是键和单键对象一一对应的映射类型
  2. 末尾的[keyof typeof Sizes]是索引访问操作,会把映射类型里所有属性的类型提取出来,组合成联合类型,最终得到的就是所有单键对象类型的联合,刚好满足单键限制的要求。

如果需要限制值的类型,只需要把代码里的any替换成目标类型即可。


内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:21:18