品牌化枚举的穷举检查技巧
利用交叉类型为枚举值附加唯一品牌标签,在编译时强制穷举所有分支。 · 难度:入门 · +10XP
品牌化枚举的穷举检查技巧
当使用 switch 语句处理枚举时,我们常用 never 类型来确保穷举。但传统枚举值可能会被意外扩展。本教程引入“品牌化枚举”模式:通过为每个枚举成员赋予一个独有的品牌类型(如 { readonly __brand: unique symbol }),使类型系统能够精确追踪每个成员的身份。结合条件类型,可以在编译时强制要求所有枚举值都被处理,且任何新增枚举都会导致编译错误。
type BrandedEnum = {
readonly Red: { readonly __brand: 'Red' }
readonly Green: { readonly __brand: 'Green' }
}
const E: BrandedEnum = {
Red: { __brand: 'Red' },
Green: { __brand: 'Green' }
}
type ValueOf = T[keyof T]
function assertNever(x: never): never { throw new Error() }
function handle(color: ValueOf) {
switch (color.__brand) {
case 'Red': return 'red'
case 'Green': return 'green'
default: return assertNever(color)
}
}