簡體   English   中英

如何從 TypeScript 中的枚舉值創建聯合類型?

[英]How to create a union type from Enum values in TypeScript?

我有以下枚舉,(可能是 const 或不是)我想派生一個聯合類型,類似於我硬編碼為MyNewOne的內容。 如何使用最新的 TS?

const enum FieldId {
    Code = 'code',
    Title = 'title',
    Statuses = 'statuses',
}
type MyNewOne = 'code' | 'title' | 'statuses'

使用映射類型

const enum FieldId {
  Code = 'code',
  Title = 'title',
  Statuses = 'statuses',
}

type ToUnion<T extends Record<string, string | number>> = keyof {
  [Prop in keyof T as `${T[Prop]}`]: Prop
}

type Result = ToUnion<typeof FieldId>

操場

我想說的第一點是。 你確定這是你想要的嗎? 枚舉的全部意義在於使用枚舉成員而不是使用字符串。 您甚至不能將原始字符串分配給枚舉成員,即使它的類型可證明是成員之一:

const enum FieldId {
    Code = 'code',
    Title = 'title',
    Statuses = 'statuses',
}
let enumValue:FieldId = 'code'; // error

游樂場鏈接

另外我想指出, FieldId類型已經是一個聯合,即枚舉成員的聯合。 所以type FieldId = FieldId.Code | FieldId.Title | FieldId.Statuses type FieldId = FieldId.Code | FieldId.Title | FieldId.Statuses type FieldId = FieldId.Code | FieldId.Title | FieldId.Statuses (例如,如果您將它與Exclude一起使用並嘗試排除一個成員ex ,則會出現這種情況)

話雖如此,我們可以通過將枚舉插入模板文字類型中來欺騙編譯器將枚舉轉換為字符串:

const enum FieldId {
    Code = 'code',
    Title = 'title',
    Statuses = 'statuses',
}
type FieldIdValue = `${FieldId}` //  "code" | "title" | "statuses"
let v:FieldIdValue = "code"
let vBad: FieldIdValue = "" //err

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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