TypeScript中自定义Guid类型无法作为Record类型索引如何解决?
问题根因
你遇到的报错是TypeScript 3.7版本的已知类型系统限制:你用string & { isGuid: true }实现的带标签字符串子类型(标称Guid类型),在该版本中不被允许作为Record的索引键使用,哪怕你声明的Record本身的键类型就是Guid也不行。
VSCode和本地tsc结果不一致的原因
VSCode 1.61.2内置的TypeScript版本高于你本地安装的3.7.0,默认情况下编辑器的类型提示用的是自带的高版本TS,高版本已经修复了这个问题,所以悬停能正确识别类型;而你本地执行编译用的是项目内的3.7.0版本,才会抛出错误,属于版本差异导致的正常现象,不是编译器不一致的bug。
修复方案
目前没有单独的tsconfig配置项可以直接解决这个问题,只能通过以下两种路径修复:
方案1:升级TypeScript版本(推荐)
直接将本地TypeScript版本升级到4.4及以上,该版本官方已经修复了标称类型作为索引键的检查问题,你现有代码不需要做任何修改就能正常编译。
方案2:兼容3.7版本的代码修改
如果暂时不能升级TS版本,可以任选以下一种方式修改代码:
- 索引时添加类型断言,改动最小:
const c: number = a[b as keyof typeof a];
- 封装兼容的Guid键字典类型,避免每次写断言:
type GuidRecord<T> = Record<string, T> // 定义字典时用该类型替代Record<Guid, T>即可 const a: GuidRecord<number> = { '3fa85f64-5717-4562-b3fc-2c963f66afa6': 42 };
内容的提问来源于stack exchange,提问作者kajacx
相关产品推荐
相关产品推荐

