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

如何在Kotlin中用常量值定义类似TypeScript的六面骰子类型?

在Kotlin中模拟六面骰子的类型约束

Kotlin里没有TypeScript那种字面量联合类型的语法,没法直接写出1 | 2 | 3 | 4 | 5 | 6这种定义,但可以通过以下几种方式实现类似的类型安全约束:

1. 使用枚举类(最推荐)

枚举类是最直接的方案,编译时就会限定只能取指定的几个值,完全符合骰子点数的场景:

enum class SixSidedDie(val value: Int) {
    ONE(1),
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6);

    // 可选:添加随机掷骰子的方法
    companion object {
        fun roll(): SixSidedDie = values().random()
    }
}

// 使用示例
val result = SixSidedDie.roll()
println("掷出了${result.value}点")

枚举类的优势是自带类型安全,你不可能传入或生成1-6之外的非法值,而且可以方便地扩展方法或属性。

2. 使用密封类(适合需要差异化逻辑的场景)

如果每个骰子点数需要有不同的行为逻辑,密封类是更好的选择,它能让你在when表达式中做穷尽检查(编译器会提示你覆盖所有分支):

sealed class SixSidedDie {
    abstract val value: Int

    object One : SixSidedDie() { override val value = 1 }
    object Two : SixSidedDie() { override val value = 2 }
    object Three : SixSidedDie() { override val value = 3 }
    object Four : SixSidedDie() { override val value = 4 }
    object Five : SixSidedDie() { override val value = 5 }
    object Six : SixSidedDie() { override val value = 6 }

    companion object {
        fun roll(): SixSidedDie = listOf(One, Two, Three, Four, Five, Six).random()
    }
}

// 使用示例:针对不同点数做不同处理
when (val die = SixSidedDie.roll()) {
    is SixSidedDie.One -> println("掷出1点,再来一次!")
    is SixSidedDie.Six -> println("掷出6点,恭喜获胜!")
    else -> println("掷出了${die.value}点")
}

为什么你的typealias写法不行?

Kotlin的typealias只是现有类型的别名,它不会创建新的类型约束。而且Kotlin没有TypeScript中的“字面量类型”(比如把1当作一个独立的类型),所以没法通过|把多个字面量组合成一个新类型。

内容的提问来源于stack exchange,提问作者Johannes Klauß

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:49