Typescript 到数组列表的通用枚举转换器

rea*_*ist 1 enums typescript angular

性别.ts

export enum Gender {
  Male = 1,
  Female = 2
}

export let genderDescriptions: { [P in keyof typeof Gender]: string } = {
  Female: "FemaleDescriptionExample",
  Male: "MaleDescriptionExample"
}
Run Code Online (Sandbox Code Playgroud)

选择项.ts

export interface SelectItem {
  label?: string;
  value: any;
}
Run Code Online (Sandbox Code Playgroud)

我的component.ts

var myList: SelectItem[] = (Object.keys(Gender) as Array<keyof typeof Gender>)
  .filter(p => typeof Gender[p] === "number")
  .map(p => ({
    label: genderDescriptions[p],
    value: Gender[p]
  }));

console.log(myList);
Run Code Online (Sandbox Code Playgroud)

你好。我有一个性别枚举,我正在映射到 SelectItem 数组。控制台给我如下结果。它运行良好。但我想要全局 enumConverter。所以我写如下,但这不起作用。我怎样才能做到这一点?

1: {label: "MaleDescriptionExample", value: 1}
2: {label: "FemaleDescriptionExample", value: 2}
Run Code Online (Sandbox Code Playgroud)

我给出了通用参数 T 和描述,但到处都给出了错误:

'T' 仅指一种类型,但在此处用作值

  enumToSelectItemArray<T,Description>() {
   return (Object.keys(T) as Array<keyof typeof T>)
      .filter(p => typeof T[p] === "number" && T[p] !== 3)
      .map(p => ({
        label: descriptin[p],
        value: T[p]
      }))
  }
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

类型参数在打字稿中在运行时被擦除,因此您无法在运行时通过它们访问任何值。您将需要参数来传递枚举和描述对象。我们将使用泛型类型参数使编译器清楚枚举对象和描述对象之间的关系。

enum Gender {
    Male = 1,
    Female = 2
}

let genderDescriptions: Record<keyof typeof Gender, string> = {
    Female: "FemaleDescriptionExample",
    Male: "MaleDescriptionExample"
}

function enumToSelectItemArray<TEnum>(enumObj: TEnum, descriptions: Record<keyof TEnum, string>)
{
    return (Object.keys(enumObj) as Array<keyof TEnum>)
        .filter(p => typeof enumObj[p] === "number")
        .map(p => ({
            label: descriptions[p],
            value: enumObj[p]
        }));
}

console.log(enumToSelectItemArray(Gender, genderDescriptions));
Run Code Online (Sandbox Code Playgroud)

注意将映射类型替换为Record它们做相同的事情(它们实际上是相同的事情)并且记录看起来更好,在我之前的答案中忘记了它。