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

如何在TypeScript中引用枚举类型?实现Question类答案类型存储

TypeScript中存储枚举类型元信息的解决方案

针对你要在Question类中存储答案类型(DoAnswer或CheckAnswer枚举)的需求,以下是几种可行的实现方式:

方法一:使用typeof获取枚举构造函数类型

这是最接近Java中Class<?>思路的实现,通过typeof关键字获取枚举对象的类型,作为answerType的属性类型:

定义枚举

enum DoAnswer {
  Run = "run",
  Jump = "jump"
}

enum CheckAnswer {
  Clock = "check the clock",
  Temperature = "check the temperature"
}

实现Question类

class Question {
  answerType: typeof DoAnswer | typeof CheckAnswer;
  correctAnswers: DoAnswer[] | CheckAnswer[];

  constructor(answerType: typeof DoAnswer | typeof CheckAnswer) {
    this.answerType = answerType;
  }

  calculateCorrectAnswers(answerService: AnswerService) {
    // 运行时判断枚举类型,调用对应服务方法
    if (this.answerType === DoAnswer) {
      this.correctAnswers = answerService.calculateCorrectDoAnswers();
    } else if (this.answerType === CheckAnswer) {
      this.correctAnswers = answerService.calculateCorrectCheckAnswers();
    }
  }
}

// 示例AnswerService实现
class AnswerService {
  calculateCorrectDoAnswers(): DoAnswer[] {
    return [DoAnswer.Run];
  }

  calculateCorrectCheckAnswers(): CheckAnswer[] {
    return [CheckAnswer.Clock];
  }
}

方法二:使用字符串标记类型(更简洁)

如果不需要直接关联枚举构造函数,仅需区分类型分支,可以用字符串字面量作为类型标记:

class Question {
  answerType: "do" | "check";
  correctAnswers: DoAnswer[] | CheckAnswer[];

  constructor(answerType: "do" | "check") {
    this.answerType = answerType;
  }

  calculateCorrectAnswers(answerService: AnswerService) {
    if (this.answerType === "do") {
      this.correctAnswers = answerService.calculateCorrectDoAnswers();
    } else {
      this.correctAnswers = answerService.calculateCorrectCheckAnswers();
    }
  }
}

方法三:泛型类(类型更安全)

通过泛型绑定具体的答案类型,让correctAnswers的类型在编译时就确定,避免类型断言:

class Question<T extends DoAnswer | CheckAnswer> {
  correctAnswers: T[];

  constructor(private answerType: typeof DoAnswer | typeof CheckAnswer) {}

  calculateCorrectAnswers(answerService: AnswerService) {
    if (this.answerType === DoAnswer) {
      this.correctAnswers = answerService.calculateCorrectDoAnswers() as T[];
    } else {
      this.correctAnswers = answerService.calculateCorrectCheckAnswers() as T[];
    }
  }
}

// 使用示例
const doQuestion = new Question<DoAnswer>(DoAnswer);
doQuestion.calculateCorrectAnswers(new AnswerService());

为什么answerType: enum不可行?

TypeScript中enum是类型定义关键字,不是一个具体的可赋值类型。只有通过typeof 枚举名才能拿到枚举对象的运行时类型,进而作为属性类型存储。

内容的提问来源于stack exchange,提问作者Panossa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:10:52