使用相同键获取枚举的函数的打字稿类型

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);

Playground