打字稿:通用枚举类型作为另一种类型的索引
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
...
我正在尝试创建一个索引类型,其索引是 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
...