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