您可以使用结合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