TypeScript中Map<string, enum>为何无法赋值给字符串索引签名对象
报错核心原因解析
你遇到的报错本质是两个完全不兼容的类型强制赋值触发的类型校验失败:
- 你在
InviteesResponse接口中定义的relationships字段类型为{ [key: string]: Relationship },这是普通JavaScript对象的索引签名声明,代表该字段是一个可以通过relationships[键名]语法直接读写属性的普通对象,所有字符串键对应的取值都是Relationship枚举类型。 - 你业务代码中实际创建的
relationships是Map<string, Relationship>类型的实例,它是ES6内置Map类的实例对象,只能通过自身提供的get()、set()、has()等方法操作键值对,本身没有实现字符串索引签名,自然无法满足普通索引对象的类型要求。
可选解决方案
WebStorm给出的修复方案是直接对齐你实际返回的变量类型,把返回值的relationships字段声明为Map类型,以此通过类型校验,除此之外你也可以根据业务需求选择另一种更适配的方案:
- 如果你不需要Map的特殊能力(比如支持非字符串类型的键、快速统计键值对数量、保证插入顺序的遍历等),只是需要简单的键值对存储,可以直接把
relationships变量改成普通对象类型,不需要修改原有接口定义:
// 替换原来的Map实例化逻辑,声明为普通索引对象 const relationships: { [key: string]: Relationship } = {}; // 赋值时使用普通对象属性赋值语法,不要用Map的set方法 relationships[userId] = 对应的Relationship枚举值;
- 如果你确实需要使用Map的相关能力,直接修改
InviteesResponse接口中的relationships字段类型为Map<string, Relationship>即可,和WebStorm的修复逻辑一致。
内容的提问来源于stack exchange,提问作者fIwJlxSzApHEZIl
相关产品推荐
相关产品推荐

