📜  更通用地将枚举解析转换为字符串 (1)

📅  最后修改于: 2023-12-03 14:55:16.864000             🧑  作者: Mango

更通用地将枚举解析转换为字符串

在开发过程中,经常会用到枚举类型(enum),但是有时候我们需要将枚举转换为字符串,以便在输出或日志中使用。这篇文章将介绍一种更通用的方法来将枚举解析为字符串。

以前的方法

在以前的方法中,我们从枚举中获取名称,例如:

enum Fruit {
  APPLE = 'apple',
  ORANGE = 'orange',
  BANANA = 'banana',
}

const fruit = Fruit.APPLE;
console.log(fruit.toString()); // 'APPLE'

这种方法只能在枚举中定义了名称的情况下才能使用。此外,如果我们改变了枚举成员的名称,我们必须手动更新输出和日志。

更通用的方法

使用 TypeScript 4.1 中引入的模板字面量类型(Template Literal Types),我们可以创建一个泛型函数来解析枚举。这个函数将枚举作为输入,并返回一个字符串类型,该字符串类型包含枚举的所有成员名称。

以下是一个解析枚举的示例函数:

type StringEnum<T extends string> = {[K in T]: K};
type ValueOf<T> = T[keyof T];

function enumToString<T extends StringEnum<T>>(e: T, value: ValueOf<T>): keyof T {
  return Object.keys(e).find((k: keyof T) => e[k] === value)!;
}

此函数的参数如下:

  • T extends StringEnum<T>:使用泛型约束,该约束限制为在类型 T 中只包含字符串(即所有枚举成员的类型都为字符串)。
  • e: T:枚举输入。
  • value: ValueOf<T>:要转换为字符串的枚举成员的值。

此函数的返回类型是一个字符串类型,该字符串类型是枚举成员名称的联合类型。

以下是一个使用示例:

enum Fruit {
  APPLE = 'apple',
  ORANGE = 'orange',
  BANANA = 'banana',
}

const fruit = Fruit.APPLE;
console.log(enumToString(Fruit, fruit)); // 'APPLE'

使用这种方法,我们可以更通用地将枚举解析为字符串,而无需使用特定的名称。此外,如果我们更改了枚举成员的名称,函数仍然会正确地解析为新名称。

结论

使用模板字面量类型,我们可以创建一个通用的泛型函数来将枚举解析为字符串。此方法比以前的方法更通用,因为它适用于所有类型的枚举,而不仅仅是具有特定名称的枚举成员。