打字稿:使用对象值作为新类型的键

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&lt;any, PropertyKey&gt; 来做到这一点,它使用内置类型 PropertyKey

我们可以使用T[keyof T] 访问T 的所有值的联合,这是一种索引访问类型。我们想创建一个Record,其中这些是新键。所以我们得到Record&lt;T[keyof T], NewValue&gt;

为了让 typescript 将 alphaomega 视为它们的字面值,而不仅仅是 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

【讨论】:

以上是关于打字稿:使用对象值作为新类型的键的主要内容,如果未能解决你的问题,请参考以下文章

具有定义值的打字稿动态对象键

我可以使用打字稿将对象键限制为枚举值吗?

打字稿:在地图中使用日期作为键?

具有未知键的对象的打字稿类型,但只有数值?

来自键值对象的打字稿类型函数

如何在打字稿中使用可能的字符串和数字索引确定对象的类型?