You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:38:11