我有一个这样的枚举:
enum Animals {
WOLF = 'wolf',
BADGER = 'badger',
CAT = 'cat',
}
我不赞成使用CAT
。意味着我的数据库中的对象仍然可以在读取这些对象时使用它,但是您不应该使用CAT
创建一个新对象。
我不想要的是这个
enum AnimalsIn {
WOLF = 'wolf',
BADGER = 'badger',
}
enum AnimalsOut {
WOLF = 'wolf',
BADGER = 'badger',
CAT = 'cat',
}
是否有一种方法可以扩展/扩展AnimalsIn
并使AnimalsOut
仅包含已弃用的枚举?或者至少检查AnimalsOut
是否具有与AnimalsIn
相同的枚举,这意味着检查它是否是一个子集。
理想情况:
type AnimalsIn = Deprecate<AnimalsOut, 'CAT'>
答案 0 :(得分:2)
枚举是值和类型的对象,因此我们将模仿需要定义两者的枚举的行为。
我们可以使用Omit
类型来排除我们不再想要的成员:
enum AnimalsOut {
WOLF = 'wolf',
BADGER = 'badger',
CAT = 'cat',
}
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> //probably in a lib already
type DeprecateEnumObject<T, K extends keyof T> = Omit<T, K>
type DeprecateEnumValues<T, K extends keyof T> = DeprecateEnumObject<T, K>[Exclude<keyof T, K>]
type AnimalsIn = DeprecateEnumValues<typeof AnimalsOut, 'CAT'>
const AnimalsIn: DeprecateEnumObject<typeof AnimalsOut, 'CAT'> = AnimalsOut;
let a: AnimalsIn = AnimalsIn.BADGER;
大多数情况下有效,枚举文字类型不起作用,我们可以使用该类型,但其含义更复杂:
let ai: AnimalsOut.BADGER = AnimalsIn.BADGER;
let ao: AnimalsIn.BADGER = AnimalsIn.BADGER;// error
let ao2: typeof AnimalsIn['BADGER'] = AnimalsIn.BADGER;// more convoluted