簡體   English   中英

Typescript - 如何正確合並兩個包含重疊的枚舉?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM