Type Gymnastics

Type Gymnastics for TypeScript

遍历 Enum

在TypeScript中,遍历枚举(Enum)的值可以通过几种方式来实现。

方法1:使用for-in循环

如果你的枚举是数字枚举,可以使用for-in循环遍历枚举的键。然后,可以通过枚举名和键名来访问枚举值。

enum Color {
    Red,
    Green,
    Blue
}
 
for (let color in Color) {
    if (isNaN(Number(color))) {
        console.log(color); // 显示键名
        console.log(Color[color]); // 显示键值
    }
}

注意:这种方法会遍历到枚举的键和值,所以通常需要检查键是否是数字来过滤掉值。

方法2:使用Object.keysforEach

如果你想遍历枚举的键,可以使用Object.keys来获取枚举键的数组,然后使用forEach来遍历。

enum Color {
    Red,
    Green,
    Blue
}
 
Object.keys(Color)
    .filter(key => isNaN(Number(key)))
    .forEach(key => {
        console.log(key); // 显示键名
        console.log(Color[key as keyof typeof Color]); // 显示键值
    });

这种方法通过过滤掉数组中的数字项,只保留键名,然后遍历这些键名。

方法3:转换为数组

如果你希望将枚举转换为数组,然后进行操作,可以使用Object.values

enum Color {
    Red,
    Green,
    Blue
}
 
const colors = Object.values(Color).filter(v => typeof v === 'string') as string[];
 
colors.forEach(color => {
    console.log(color); // 显示键名
    console.log(Color[color as keyof typeof Color]); // 显示键值
});

这种方法首先将枚举转换为值的数组,然后过滤掉数字类型的值,只留下字符串类型的键名。

注意事项

  • 当枚举是数字枚举时,枚举对象既包含键到值的映射,也包含值到键的映射,所以遍历时需要注意过滤。
  • 如果枚举是字符串枚举,可以直接使用Object.keysObject.values来遍历,不需要额外的过滤。

数组元素的类型

使用 typeof 和索引访问类型

如果你有一个具体的数组实例,你可以通过索引访问类型来推导元素类型:

const myArray = [1, 2, 3];
type ElementType = typeof myArray[number]; // ElementType is inferred as number

这里,typeof myArray[number] 表示取myArray的类型,然后使用[number]来获取这个类型的数字索引签名,也就是数组元素的类型。