如何在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
相关产品推荐
相关产品推荐

