如何基于TypeScript数字枚举推断严格键值对象类型?
解决方案
要实现键为LogLevel枚举数值、值为对应枚举名称的严格类型约束对象,可以利用TypeScript的映射类型结合枚举的反向映射特性:
首先定义约束类型:
type LogLevelNameMap = { [K in LogLevel]: typeof LogLevel[K]; };
然后创建符合该类型的对象:
const logLevelNames: LogLevelNameMap = { [LogLevel.NONE]: 'NONE', [LogLevel.ERROR]: 'ERROR', [LogLevel.WARNING]: 'WARNING', [LogLevel.INFO]: 'INFO', [LogLevel.DEBUG]: 'DEBUG', };
类型约束说明
- 映射类型
[K in LogLevel]会遍历LogLevel的所有数值枚举成员,确保对象包含所有枚举值作为键; typeof LogLevel[K]利用数字枚举的反向映射特性,直接获取该数值对应的枚举名称字符串类型,保证每个键对应的值必须是其专属的枚举名称,完全杜绝键值不匹配的情况。
错误验证
如果尝试给键设置不匹配的枚举名称,TypeScript会直接抛出类型错误:
// 报错:类型 '"WARNING"' 不能赋值给类型 '"ERROR"' const invalidMap: LogLevelNameMap = { [LogLevel.NONE]: 'NONE', [LogLevel.ERROR]: 'WARNING', // 此处不符合类型约束 [LogLevel.WARNING]: 'WARNING', [LogLevel.INFO]: 'INFO', [LogLevel.DEBUG]: 'DEBUG', };
内容的提问来源于stack exchange,提问作者Slava.In
相关产品推荐
相关产品推荐

