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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:04