打字稿:使用对象值作为新类型的键
Posted
技术标签:
【中文标题】打字稿:使用对象值作为新类型的键【英文标题】:Typescript: Use object values as keys for a new type 【发布时间】:2021-05-21 18:27:00 【问题描述】:我有一个对象:
export const CODES =
ALPHA: 'alpha',
OMEGA: 'omega',
我想要一个新的类型,应该是这样的:
export type CODES_OBJECTS =
alpha: ,
omega:
但显然由于 CODES 将来可以更改并获得更多键值对,我想创建一个通用类型,它会自动从 CODES 中获取所有值作为键。 我找到了这个Types from both keys and values of object in Typescript,但该解决方案不适用于我的情况。
如果它更简单的代码也可以是枚举。
【问题讨论】:
【参考方案1】:您可以使用结合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: ;
*/
Playground Link
说明
ValuesAsKeys
类型采用两个泛型——T
是我们想要将其值用作键的对象(您的 CODES
const),NewValue
是我们想要分配给这些键的值(这里是一个空对象,但你可能想要更好的东西。
为了将T
的值用作键,我们必须坚持T
的值是可以用作键的东西。我们使用 T extends Record<any, PropertyKey>
来做到这一点,它使用内置类型 PropertyKey
。
我们可以使用T[keyof T]
访问T
的所有值的联合,这是一种索引访问类型。我们想创建一个Record
,其中这些是新键。所以我们得到Record<T[keyof T], NewValue>
。
为了让 typescript 将 alpha
和 omega
视为它们的字面值,而不仅仅是 string
,我们在创建 CODES
时使用 as const
。
CODES
是一个值而不是一个类型,所以我们使用typeof CODES
作为T
。
枚举版本
如果使用enum
,打字稿几乎相同。唯一的区别是不需要添加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, >
Playground Link
【讨论】:
以上是关于打字稿:使用对象值作为新类型的键的主要内容,如果未能解决你的问题,请参考以下文章