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.keys
和forEach
如果你想遍历枚举的键,可以使用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.keys
或Object.values
来遍历,不需要额外的过滤。
数组元素的类型
使用 typeof
和索引访问类型
如果你有一个具体的数组实例,你可以通过索引访问类型来推导元素类型:
const myArray = [1, 2, 3];
type ElementType = typeof myArray[number]; // ElementType is inferred as number
这里,typeof myArray[number]
表示取myArray
的类型,然后使用[number]来获取这个类型的数字索引签名,也就是数组元素的类型。