簡體   English   中英

Typescript:使用 object 值作為新類型的鍵

[英]Typescript: Use object values as keys for a new type

我有一個 Object:

export const CODES = {
   ALPHA: 'alpha',
   OMEGA: 'omega',
}

我想要一個新類型,它應該看起來像:

export type CODES_OBJECTS = {
 alpha: {},
 omega: {}
}

但顯然,由於 CODES 將來可以更改並獲得更多鍵值對,我想創建一個通用類型,它會自動從 CODES 中獲取所有值作為鍵。 從 Typescript 中的 object 的鍵和值中找到了這個類型,但該解決方案不適用於我的情況。

此外,如果它更簡單的 CODES 也可以是枚舉。

您可以使用結合keyof的索引訪問類型來獲得您想要的。

代碼

type ValuesAsKeys<T extends Record<any, PropertyKey>, NewValue> = Record<T[keyof T], NewValue>

export const CODES = {
   ALPHA: 'alpha',
   OMEGA: 'omega',
} as const;

export type CODES_OBJECTS = ValuesAsKeys<typeof CODES, {}>
/* resolves to type CODES_OBJECTS = {
    alpha: {};
    omega: {};
} */

游樂場鏈接

解釋

ValuesAsKeys類型需要兩個 generics - T是 object,我們想要將其值用作鍵(您的CODES常量),而NewValue是我們想要分配給這些鍵的值(這里可能是一個空的{}但您可能需要更好的東西)。

為了使用T的值作為鍵,我們必須堅持T的值是可以用作鍵的東西。 我們通過使用內置類型PropertyKeyT extends Record<any, PropertyKey>來做到這一點。

我們可以使用索引訪問類型T[keyof T]訪問T的所有值的聯合。 我們想創建一個Record ,其中這些是新鍵。 所以我們得到Record<T[keyof T], NewValue>

為了讓 typescript 將alphaomega視為它們的文字值而不僅僅是string ,我們在創建CODES時使用as const

CODES是一個值而不是一個類型,所以我們使用typeof CODES作為T

枚舉版本

如果使用enum , typescript 幾乎相同。 唯一的區別是您不需要添加as const

type ValuesAsKeys<T extends Record<any, PropertyKey>, NewValue> = Record<T[keyof T], NewValue>

enum CODES {
   ALPHA = 'alpha',
   OMEGA = 'omega',
}

export type CODES_OBJECTS = ValuesAsKeys<typeof CODES, {}>

游樂場鏈接

暫無
暫無

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

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