从 Typescript 中的枚举中获取所有项目的数组
Getting an Array of all items from an Enum in Typescript
我正在尝试获取 TypeScript 枚举的所有项目。为此,我使用以下通用函数:
static getAllValues<T>(enumeration: T): Array<T>{
let enumKeys: Array<T> = Object.keys(enumeration).map(k => enumeration[k]);
let items: Array<T> = new Array<T>();
for(let elem of enumKeys){
if (typeof(elem) === "number"){
items.push(elem)
}
}
return items;
}
通过使用 ExampleEnum
类型的枚举调用此函数,例如
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
我期望 Array<ExampleEnum>
类型的 return 值,但响应来自 Array<typeof ExampleEnum>
.
类型
有谁知道如何修复它,从类型 Array<ExampleEnum>
得到 return?
(我使用的是 TypeScript 3.2.1)
您正在为 enum
传递容器对象,因此 T
将成为容器对象。容器对象与枚举类型不同,它是一个包含枚举值的对象,因此它的值将是我们可以使用 T[keyof T]
获得的枚举类型
function getAllValues<T>(enumeration: T): Array<T[keyof T]> {
let enumKeys = Object.keys(enumeration).map(k => enumeration[k]);
let items = new Array<T[keyof T]>();
for (let elem of enumKeys) {
if (typeof (elem) === "number") {
items.push(elem as any)
}
}
return items;
}
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
getAllValues(ExampleEnum);
您如何看待这个版本的函数,它更短而且还在处理 string enum
?
function enumValues<T extends object>(enumeration: T): Array<T[keyof T]> {
return Object
.keys(enumeration)
.filter(k => isNaN(Number(k)))
.map(k => enumeration[k]);
}
enum ExampleEnum {
FOO = 10,
BAR = 20,
BAZ = 30
}
console.log(enumValues(ExampleEnum)); // [10, 20, 30]
enum ExampleStringEnum {
FOO = 'F',
BAR = 'B',
BAZ = 'Z'
}
console.log(enumValues(ExampleStringEnum)); // ['F', 'B', 'Z']
我正在尝试获取 TypeScript 枚举的所有项目。为此,我使用以下通用函数:
static getAllValues<T>(enumeration: T): Array<T>{
let enumKeys: Array<T> = Object.keys(enumeration).map(k => enumeration[k]);
let items: Array<T> = new Array<T>();
for(let elem of enumKeys){
if (typeof(elem) === "number"){
items.push(elem)
}
}
return items;
}
通过使用 ExampleEnum
类型的枚举调用此函数,例如
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
我期望 Array<ExampleEnum>
类型的 return 值,但响应来自 Array<typeof ExampleEnum>
.
有谁知道如何修复它,从类型 Array<ExampleEnum>
得到 return?
(我使用的是 TypeScript 3.2.1)
您正在为 enum
传递容器对象,因此 T
将成为容器对象。容器对象与枚举类型不同,它是一个包含枚举值的对象,因此它的值将是我们可以使用 T[keyof T]
function getAllValues<T>(enumeration: T): Array<T[keyof T]> {
let enumKeys = Object.keys(enumeration).map(k => enumeration[k]);
let items = new Array<T[keyof T]>();
for (let elem of enumKeys) {
if (typeof (elem) === "number") {
items.push(elem as any)
}
}
return items;
}
export enum ExampleEnum {
FOO,
BAR,
FOOBAR
}
getAllValues(ExampleEnum);
您如何看待这个版本的函数,它更短而且还在处理 string enum
?
function enumValues<T extends object>(enumeration: T): Array<T[keyof T]> {
return Object
.keys(enumeration)
.filter(k => isNaN(Number(k)))
.map(k => enumeration[k]);
}
enum ExampleEnum {
FOO = 10,
BAR = 20,
BAZ = 30
}
console.log(enumValues(ExampleEnum)); // [10, 20, 30]
enum ExampleStringEnum {
FOO = 'F',
BAR = 'B',
BAZ = 'Z'
}
console.log(enumValues(ExampleStringEnum)); // ['F', 'B', 'Z']