[英]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
的值是可以用作鍵的東西。 我們通過使用內置類型PropertyKey
的T extends Record<any, PropertyKey>
來做到這一點。
我們可以使用索引訪問類型T[keyof T]
訪問T
的所有值的聯合。 我們想創建一個Record
,其中這些是新鍵。 所以我們得到Record<T[keyof T], NewValue>
。
為了讓 typescript 將alpha
和omega
視為它們的文字值而不僅僅是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.