如何在TypeScript中复刻Kotlin的密封类与枚举模式?
在TypeScript中复刻Kotlin密封类+枚举的答题状态模式
我正在尝试在TypeScript代码中复刻Kotlin的一种模式,这是一个答题游戏,用户需要在计时器结束前回答问题。满足以下条件时会生成下一题:
- 计时器结束
- 用户选择了正确答案
每次题目结束时我需要执行一些操作,但要根据结束原因执行不同的具体操作。
Kotlin中可以通过密封类和枚举实现该模式:
enum class QuestionEndStatus { TIME_UP, CORRECT_ANSWER } sealed class QuestionStatus { object Ongoing : QuestionStatus() data class End(val endStatus: QuestionEndStatus) : QuestionStatus() }
使用该结构的示例如下:
fun handleQuestionStatus(questionStatus: QuestionStatus) { if (questionStatus is QuestionStatus.End) { // 处理题目结束的通用逻辑... if (questionStatus.endStatus == QuestionEndStatus.TIME_UP) { // 处理超时逻辑... } if (questionStatus.endStatus == QuestionEndStatus.CORRECT_ANSWER) { // 处理答对逻辑... } } }
当然可以在TypeScript中实现类似功能,这里提供两种常用方案:
方案一:枚举 + 联合类型(最贴近Kotlin的实现)
TypeScript的枚举和联合类型可以完美对应Kotlin的枚举和密封类,实现类型安全的状态分支处理:
// 定义结束状态枚举 enum QuestionEndStatus { TIME_UP = 'TIME_UP', CORRECT_ANSWER = 'CORRECT_ANSWER' } // 定义联合类型替代密封类 type QuestionStatus = | { type: 'ONGOING' } | { type: 'END', endStatus: QuestionEndStatus }; // 状态处理函数 function handleQuestionStatus(questionStatus: QuestionStatus) { if (questionStatus.type === 'END') { // 处理题目结束的通用逻辑 switch (questionStatus.endStatus) { case QuestionEndStatus.TIME_UP: // 处理超时逻辑 break; case QuestionEndStatus.CORRECT_ANSWER: // 处理答对逻辑 break; } } }
方案二:字符串字面量类型(更轻量化)
如果不需要枚举的额外特性,直接用字符串字面量定义状态可以让代码更简洁,同时保持类型安全:
// 用字面量类型定义结束状态 type QuestionEndStatus = 'TIME_UP' | 'CORRECT_ANSWER'; // 定义联合类型状态 type QuestionStatus = | { type: 'ONGOING' } | { type: 'END', endStatus: QuestionEndStatus }; // 状态处理函数 function handleQuestionStatus(questionStatus: QuestionStatus) { if (questionStatus.type === 'END') { // 处理题目结束的通用逻辑 switch (questionStatus.endStatus) { case 'TIME_UP': // 处理超时逻辑 break; case 'CORRECT_ANSWER': // 处理答对逻辑 break; } } }
这两种方案都能实现和Kotlin版本一致的逻辑:通过类型收窄确保你只能处理合法的状态分支,TypeScript编译器会在你遗漏分支或者处理错误状态时给出提示,完全满足答题游戏的需求。
内容的提问来源于stack exchange,提问作者Kun.tito
相关产品推荐
相关产品推荐

