弃用枚举值而不重复

时间:2019-02-07 15:08:20

标签: typescript

我有一个这样的枚举:

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'>

1 个答案:

答案 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