[英]Typescript - How to properly merge two enums that contain overlaps?
給定以下枚舉:
enum MyFirstEnum {
A = 'A',
B = 'B',
C = 'C'
}
enum MySecondEnum {
C = 'C',
D = 'D',
E = 'E'
}
合並它們的正確方法是什么? 請注意,它們在鍵C = 'C'
中包含重疊,所以只是MyFirstEnum | MySecondEnum
MyFirstEnum | MySecondEnum
可能會引起一些麻煩,例如:
type BothEnums = MyFirstEnum | MySecondEnum
const myRecord: Partial<Record<BothEnums, string>> = {}
const someKey = MyFirstEnum.C
myRecord[someKey] = 'some value' // ❌ Property '[MyFirstEnum.C]' does not exist on type 'Partial<Record<BothEnums, string>>'
如果我從這個問題How to merge two enums in TypeScript 中理解正確, Typescript 不能很好地處理具有重復鍵和值的不同枚舉。
但是,如果真的需要將枚舉與這種重疊合並,如何在沒有(或更少)進一步問題的情況下做到這一點?
那行得通嗎?
type BothEnums = {[key in keyof typeof MyFirstEnum | keyof typeof MySecondEnum] :
key extends keyof typeof MyFirstEnum ? key extends keyof typeof MySecondEnum ? (typeof MySecondEnum[key] | typeof MyFirstEnum[key]) :
typeof MyFirstEnum[key] : key extends keyof typeof MySecondEnum ? typeof MySecondEnum[key] : never}
相當於:
type BothEnums = {
A: MyFirstEnum.A;
B: MyFirstEnum.B;
C: MyFirstEnum.C | MySecondEnum.C;
D: MySecondEnum.D;
E: MySecondEnum.E;
}
需要用 keyof 調用:
const myRecord: Partial<Record<keyof BothEnums, string>> = {}
const someKey1 = MyFirstEnum.C
const someKey2 = MySecondEnum.C
myRecord[someKey1] = 'some value 1'
myRecord[someKey2] = 'some value 2'
console.log(JSON.stringify(myRecord)) // "{"C":"some value 2"}"
但我個人更喜歡這個選項:
const MyFirstEnumDef = ['A','B','C'] as const satisfies readonly string[];
const MySecondEnumDef = ['C','D','E'] as const satisfies readonly string[];
type MyFirstEnum = typeof MyFirstEnumDef[number]
type MySecondEnum = typeof MySecondEnumDef[number]
type BothEnums = MyFirstEnum | MySecondEnum
const myRecord: Partial<Record<BothEnums, string>> = {}
const someKey1 = "C"
myRecord[someKey1] = 'some value 1'
console.log(JSON.stringify(myRecord)) // "{"C":"some value 1"}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.