Вы, вероятно, путаете названный тип 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, вероятно, дает другую, но похожую ошибку)
пытался сказать вам, что выпытались вставить значение свойства в массив карт ключ-значение, что было ошибкой.Иногда вам нужно утверждать, чтобы добиться цели, но это не один из тех времен.
Хорошо, надеюсь, это помогает.Удачи!