如何解析泛型函数中的枚举以返回枚举值的数组?

时间:2018-10-17 12:54:50

标签: typescript enums

我需要构建一个可以发送枚举的函数:

Student.Id

并返回一个类似

的数组
listOfTuplesOne.ForEach(
    x => x.Item2.Where(d => d.Id == listOfTuplesTwo.Select(
        r => r.Item2.Select(z => z.Id));

I did this,但是函数的返回类型错误enum myExample { value1, value2 }

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

我正在使用Typescript 2.6

2 个答案:

答案 0 :(得分:3)

您可能会将命名 type myExample与命名 value myExample混淆。尽管名称相同,但它们并不相同。 type myExample是数字的枚举值的类型。 myExample的类型为typeof myExample,从键value1value2到那些myExample枚举值的映射。也就是说,typeof myExample类似于{example1: myExample.example1, example2: myExample.example2}

(有关我在TypeScript中命名值和命名类型之间差异的更多抱怨,请参见this answer

因此,当您将值myExample传递到getArrayWithNumberBaseEnumItems()时,您正在传递typeof myExample并希望myExample[]出来。从前者到后者的方法是将T(对应于typeof myExample)到T[keyof T](意为“ { {1}}”)。

因此,您应该将类​​型修改为以下内容:

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

(那是TS3.1给出的错误。TS2.6可能给出了外观不同但相似的错误)

试图告诉您,您试图将属性值推入键值映射数组中,这是一个错误。有时您需要断言才能完成工作,但这不是那种情况。

好的,希望能有所帮助。祝你好运!

答案 1 :(得分:1)

您可以通过使用类型查询来获取枚举的值类型:

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]