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' };
实现原理
- 外层
[K in keyof typeof Sizes]会遍历枚举的每一个键,为每个键K生成一个仅包含当前键的对象类型{ [P in K]: any },这一步得到的是键和单键对象一一对应的映射类型 - 末尾的
[keyof typeof Sizes]是索引访问操作,会把映射类型里所有属性的类型提取出来,组合成联合类型,最终得到的就是所有单键对象类型的联合,刚好满足单键限制的要求。
如果需要限制值的类型,只需要把代码里的any替换成目标类型即可。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

