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

