使用相同键获取枚举的函数的打字稿类型
Typescript typing for function that takes enums with the same keys
我想编写一个辅助函数,用于获取具有相同键集的两个枚举,并返回一个对象数组,每个键都具有两个枚举的值。例如:
enum OptionLabel {
OPTION_1 = 'label 1',
OPTION_2 = 'label 2'
}
enum OptionValue {
OPTION_1 = 'value 1',
OPTION_2 = 'value 2'
}
const OPTIONS = getOptions(OptionLabel, OptionValue);
// OPTIONS is [{ label: 'label 1', value: 'value 1' }, { label: 'label 2', value: 'value 2' }]
这是我目前的情况:
const getOptions = <LabelEnumType, ValueEnumType>(
LabelEnum: LabelEnumType,
ValueEnum: ValueEnumType
): { label: LabelEnumType; value: ValueEnumType }[] =>
(Object.keys(LabelEnum) as (keyof typeof LabelEnum)[]).map((key) => ({
label: LabelEnum[key] as unknown as LabelEnumType,
value: ValueEnum[
key as unknown as keyof ValueEnumType
] as unknown as ValueEnumType,
}));
如您所见,正在进行大量不受欢迎的转换——这里的理想输入是什么?
您需要为第二个泛型参数添加额外的约束 ValueEnumType
。因为两个枚举应该有相同的 keys
enum OptionLabel {
OPTION_1 = 'label 1',
OPTION_2 = 'label 2'
}
enum OptionValue {
OPTION_1 = 'value 1',
OPTION_2 = 'value 2'
}
const getOptions = <
LabelEnum,
ValueEnum extends Record<keyof LabelEnum, string>
>(
LabelEnum: LabelEnum,
ValueEnum: ValueEnum
) =>
(Object.keys(LabelEnum) as (keyof typeof LabelEnum)[])
.map((key) => ({
label: LabelEnum[key],
value: ValueEnum[key],
}));
const OPTIONS = getOptions(OptionLabel, OptionValue);
我想编写一个辅助函数,用于获取具有相同键集的两个枚举,并返回一个对象数组,每个键都具有两个枚举的值。例如:
enum OptionLabel {
OPTION_1 = 'label 1',
OPTION_2 = 'label 2'
}
enum OptionValue {
OPTION_1 = 'value 1',
OPTION_2 = 'value 2'
}
const OPTIONS = getOptions(OptionLabel, OptionValue);
// OPTIONS is [{ label: 'label 1', value: 'value 1' }, { label: 'label 2', value: 'value 2' }]
这是我目前的情况:
const getOptions = <LabelEnumType, ValueEnumType>(
LabelEnum: LabelEnumType,
ValueEnum: ValueEnumType
): { label: LabelEnumType; value: ValueEnumType }[] =>
(Object.keys(LabelEnum) as (keyof typeof LabelEnum)[]).map((key) => ({
label: LabelEnum[key] as unknown as LabelEnumType,
value: ValueEnum[
key as unknown as keyof ValueEnumType
] as unknown as ValueEnumType,
}));
如您所见,正在进行大量不受欢迎的转换——这里的理想输入是什么?
您需要为第二个泛型参数添加额外的约束 ValueEnumType
。因为两个枚举应该有相同的 keys
enum OptionLabel {
OPTION_1 = 'label 1',
OPTION_2 = 'label 2'
}
enum OptionValue {
OPTION_1 = 'value 1',
OPTION_2 = 'value 2'
}
const getOptions = <
LabelEnum,
ValueEnum extends Record<keyof LabelEnum, string>
>(
LabelEnum: LabelEnum,
ValueEnum: ValueEnum
) =>
(Object.keys(LabelEnum) as (keyof typeof LabelEnum)[])
.map((key) => ({
label: LabelEnum[key],
value: ValueEnum[key],
}));
const OPTIONS = getOptions(OptionLabel, OptionValue);