TypeScript中如何将枚举SoundTypes用作对象键类型?
实现方法当然有!
作为TypeScript新手,你这个需求其实很常见,而且TypeScript对枚举作为对象键的支持已经很完善了,我来给你说最贴合你现有代码的实现方式:
首先,你当前的枚举是数字枚举(成员默认是0、1这样的数值),但你的AudioFileInfo用的是字符串作为键,两者类型不匹配。最直接的解决办法是把枚举改成字符串枚举,让枚举成员的字面量和你对象的键完全一致:
// 修改枚举为字符串枚举 export enum SoundTypes { NORMAL_REEL_SPIN = "NORMAL_REEL_SPIN", BUTTON_CLICK = "BUTTON_CLICK" }
接下来,用TypeScript的映射类型来定义AudioFileInfo的类型,这是指定“键为枚举所有成员”的标准写法,比你尝试的{ [id: SoundTypes]: ... }更严谨:
// 现在可以直接用SoundTypes作为键的类型了 static AudioFileInfo: { [id in SoundTypes]: IAudioFileData } = { [SoundTypes.NORMAL_REEL_SPIN]: { fileName: "reelspin_music", volume: 0.1, inPrimary: true }, [SoundTypes.BUTTON_CLICK]: { fileName: "El_ButtonGeneral1", volume: 0.1, inPrimary: true }, }
为什么这么做?
- 字符串枚举的成员值就是你原来用的字符串键,完美适配现有对象结构
- 映射类型
[id in SoundTypes]会强制你为枚举的每一个成员都提供对应的音频信息,避免遗漏(如果少写了某个枚举成员,TypeScript会直接报错提醒) - 后续如果扩展SoundTypes枚举,TypeScript会自动检查AudioFileInfo是否同步更新,类型安全拉满
如果你实在不想修改原来的数字枚举,其实也能实现,但需要把对象的键改成枚举对应的数值(比如0、1或者SoundTypes.NORMAL_REEL_SPIN),但这样就和你原来的字符串键结构不一致了,所以更推荐上面的字符串枚举方案。
内容的提问来源于stack exchange,提问作者Janaka
相关产品推荐
相关产品推荐

