打字稿:通用枚举类型作为另一种类型的索引

Typescript: Generic enum types as index for another type

我正在尝试创建一个索引类型,其索引是 enum 的值,但 enum 来自通用参数。

export type EnumMap<TEnum extends string | undefined = undefined> = {
  [key: TEnum]: ValueClass;
}
export type EnumMap<TEnum extends string | undefined = undefined> = {
  [key: keyof TEnum]: ValueClass;
}

这两个实现都显示错误:

An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead.

当我按照建议将其实现为映射对象时:

export type EnumMap<TEnum extends string | undefined = undefined> = {
  [TEnumKey in keyof TEnum]: ValueClass;
}

它没有在定义中显示任何错误,但它只接受 TEnum 个实例作为值。当我尝试实例化 EnumMap.

时显示此错误

Type '{ "test": ValueClass; }' is not assignable to type 'TestEnum'.

我正在使用这个 enum 作为测试:

export enum TestEnum {
  test = 'test'
}

有什么方法可以使用泛型 enum 作为类型的索引吗?

PS.: 我知道我可以使用字符串作为键来实现它,但我想将索引与枚举值联系起来;

export type EnumMap = {
  [key: string]: ValueClass;
}
const map: EnumMap = { [TestEnum.test]: {...} }; // works fine

这对你有用吗?

enum Enum {
  "ABC" = "abc",
  "CDE" = "cde"
}

export type EnumMap<TEnum extends string = Enum> = {
  [key in TEnum]?: string;
}

const map: EnumMap = { [Enum.ABC]: "123" };

由于TEnum是一个字符串联合,你可以在索引签名中将它用作[key in TEnum]

我不确定你为什么使用 string | undefined 作为 TEnum...