自嘲枚举值不重复

问题描述 投票:1回答:1

我有一个这样的枚举:

enum Animals {
 WOLF = 'wolf',
 BADGER = 'badger',
 CAT = 'cat',
}

而且我自嘲CAT。含义在我的数据库对象仍然可以拥有对这些对象的读,但你不应该能够创建一个新的对象与CAT

我不希望是这样的:

enum AnimalsIn {
 WOLF = 'wolf',
 BADGER = 'badger',
}
enum AnimalsOut {
 WOLF = 'wolf',
 BADGER = 'badger',
 CAT = 'cat',
}

有没有一种方式来传播/延长AnimalsInAnimalsOut只包含弃用枚举?或者至少检查AnimalsOut具有所有AnimalsIn,这意味着检查,如果它是一个子集相同的枚举。

理想的情况是:

type AnimalsIn = Deprecate<AnimalsOut, 'CAT'>
typescript
1个回答
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 
© www.soinside.com 2019 - 2024. All rights reserved.