我有一个这样的枚举:
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'>
枚举是不是值和类型,所以我们要模仿我们需要同时定义枚举的行为。
我们可以使用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