【问题标题】: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,但该解决方案不适用于我的情况。

如果它更简单的代码也可以是枚举。

【问题讨论】:

    标签: typescript object types


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2021-02-05
      • 2020-03-03
      • 2021-05-06
      • 2021-04-02
      • 2019-10-18
      • 2019-03-13
      相关资源
      最近更新 更多