TypeScript中如何创建<string, RoleManager实例>类型的Map?
解决TypeScript中类表达式的实例类型Map声明问题
问题原因
你用const RoleManager = class {}这种类表达式定义类时,RoleManager在TypeScript中是一个值(构造函数),而非类型。直接写Map<string, RoleManager>会报错,因为TypeScript无法识别它为类型;而typeof RoleManager表示的是类的构造函数类型(包含prototype等属性),和你要存储的实例类型不匹配,所以会出现类型不兼容的错误。
解决方案
使用TypeScript内置的InstanceType工具类型,它可以从类的构造函数类型中提取出实例类型。修改GuildManager中的类型声明:
// GuildManager.ts import GuildObject from '../interfaces/guild/GuildObject'; import RoleManager from './RoleManager'; // 假设EmojiManager已正确导入 import EmojiManager from './EmojiManager'; const GuildManager = class { id: string; name: string; ownerID: string; // 使用InstanceType获取RoleManager的实例类型 roles: Map<string, InstanceType<typeof RoleManager>>; emojis: Map<string, InstanceType<typeof EmojiManager>>; constructor(guild: GuildObject) { this.id = guild.id; this.name = guild.name; this.ownerID = guild.owner_id; this.roles = new Map(); this.emojis = new Map(); guild.roles.forEach(role => this.roles.set(role.id, new RoleManager(role))); // 修复这里的错误:把emoji实例放到emojis Map,而非roles guild.emojis.forEach(emoji => this.emojis.set(emoji.id, new EmojiManager(emoji))); } } export default GuildManager;
另外,你的代码还有两处小问题需要修正:
- RoleManager构造函数中
this.mentionable = role.mentionabale;拼写错误,应为mentionable:
// RoleManager.ts 构造函数内 this.mentionable = role.mentionable;
- GuildManager中处理emojis时,错误地将实例存入了
rolesMap,需改为emojisMap(如上代码所示)。
补充说明
如果你希望更直观地使用实例类型,也可以给类表达式显式定义一个接口:
// RoleManager.ts import RoleObject from "../interfaces/guild/RoleObject"; import AvatarObject from "../interfaces/user/AvatarObject"; // 定义实例接口 interface RoleInstance { id: string; name: string; color: number; hoisted: boolean; icon: AvatarObject; position: number; managed: boolean; mentionable: boolean; } const RoleManager = class implements RoleInstance { id: string; name: string; color: number; hoisted: boolean; icon: AvatarObject; position: number; managed: boolean; mentionable: boolean; constructor(role: RoleObject) { // ... 构造函数逻辑 this.mentionable = role.mentionable; // 修复拼写错误 } } export default RoleManager; export type { RoleInstance };
然后在GuildManager中导入RoleInstance,直接使用:
roles: Map<string, RoleInstance>;
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

