繁体   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