Как разобрать Enum в универсальной функции, чтобы вернуть массив значений enum? - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно создать функцию, в которую я могу отправить перечисление:

enum myExample {
   value1,
   value2
}

и вернуть массив типа

[myExample.value1,myExample.value2] : myExample[]

Я сделал это ,но тип возвращаемого значения функции неправильный let x: (typeof myExample)[].

 enum myExample {
    value1,
    value2
}

function getArrayWithNumberBaseEnumItems<T>(numberEnum: T): T[]{
    let arrayWithEnumItems: T[] = [];
    for (let item in numberEnum) {
        if (isNaN(Number(item))) {
            arrayWithEnumItems.push(numberEnum[item] as any);
            console.log(numberEnum[item]);
        }
    }
    return arrayWithEnumItems;
}

let x = getArrayWithNumberBaseEnumItems(myExample);
console.dir(x); // [0,1]

Я использую Typescript 2.6

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вы, вероятно, путаете названный тип myExample с названным значением myExample.Они не одинаковы, несмотря на то же имя.Тип myExample - это тип значений перечисления, которые являются числами.Значение myExample имеет тип typeof myExample, сопоставление ключей value1 и value2 с этими myExample значениями перечисления.То есть typeof myExample - это что-то вроде {example1: myExample.example1, example2: myExample.example2}.

(Более подробную информацию о разнице между именованными значениями и именованными типами в TypeScript см. В этом ответе )

Поэтому, когда вы передаете значение от myExample до getArrayWithNumberBaseEnumItems(), вы передаете typeof myExample и хотите, чтобы myExample[] вышел.Чтобы перейти от первого к последнему, нужно выполнить поиск от T (что соответствует typeof myExample) до T[keyof T] (что означает "значения свойств T").,

Таким образом, вы должны изменить ваши типы следующим образом:

function getArrayWithNumberBaseEnumItems<T>(numberEnum: T): T[keyof T][] {
  let arrayWithEnumItems: T[keyof T][] = [];
  for (let item in numberEnum) {
    if (isNaN(Number(item))) {
      arrayWithEnumItems.push(numberEnum[item]); // no type assertion here
      console.log(numberEnum[item]);
    }
  }
  return arrayWithEnumItems;
}

Обратите внимание, как я удалил ваше утверждение типа от numberEnum[item] до any.Ошибка, которую вы подавляли:

// Argument of type 'T[Extract<keyof T, string>]' 
// is not assignable to parameter of type 'T'.

(это ошибка TS3.1. TS2.6, вероятно, дает другую, но похожую ошибку)

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

Хорошо, надеюсь, это помогает.Удачи!

0 голосов
/ 17 октября 2018

Тип значения перечисления можно получить с помощью запроса типа:

enum myExample {
    value1,
    value2
}

function getArrayWithNumberBaseEnumItems<T>(numberEnum: T): T[keyof T][] {
    let arrayWithEnumItems: T[keyof T][] = [];
    for (let item in numberEnum) {
        if (isNaN(Number(item))) {
            arrayWithEnumItems.push(numberEnum[item]);
            console.log(numberEnum[item]);
        }
    }
    return arrayWithEnumItems;
}

let x = getArrayWithNumberBaseEnumItems(myExample);
console.dir(x); // [0,1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...