我需要构建一个可以发送枚举的函数:
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
答案 0 :(得分:3)
您可能会将命名 type myExample
与命名 value myExample
混淆。尽管名称相同,但它们并不相同。 type myExample
是数字的枚举值的类型。 值 myExample
的类型为typeof myExample
,从键value1
和value2
到那些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]