Общий преобразователь перечисления в список массивов для Typescript - PullRequest
0 голосов
/ 21 сентября 2018

пол.ц

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

export let genderDescriptions: { [P in keyof typeof Gender]: string } = {
  Female: "FemaleDescriptionExample",
  Male: "MaleDescriptionExample"
}

selectitem.ts

export interface SelectItem {
  label?: string;
  value: any;
}

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

Привет.У меня есть пол enum, и я сопоставляю с массивом SelectItem.Консоль даст мне результат, как показано ниже.Работает отлично.Но я хочу глобальный enumConverter.Итак, я написал, как показано ниже, но это не работает.Как я могу сделать это как универсальный?

1: {label: "MaleDescriptionExample", value: 1}
2: {label: "FemaleDescriptionExample", value: 2}

Я дал универсальный параметр 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]
      }))
  }

1 Ответ

0 голосов
/ 21 сентября 2018

Параметры типа стираются во время выполнения в машинописном тексте, поэтому вы не можете получить доступ к каким-либо значениям во время выполнения через них.Вам понадобятся параметры для передачи в enum и объект описания.Мы будем использовать параметр универсального типа, чтобы сделать связь между объектом enum и объектом описаний понятной для компилятора.

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

Примечание Заменил сопоставленный тип на Record, который они делаютто же самое (они на самом деле одно и то же), и запись выглядит лучше, забыл об этом в моем предыдущем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...