从枚举值创建 Typescript 类型

Create Typescript Type from Enum values

我正在寻找一种从 ENUM 值创建 Typescript 类型的方法。 目前我必须手动构建类型并使其与 ENUM 保持同步。

有没有办法从 ENUM 值中创建一个类型?最终结果是,当我更新 ENUM 时,类型将自动反映出来

enum FRUITS {
    APPLE = 'apple',
    PEAR = 'pear',
    ORANGE = 'orange',
}

// type Fruits = FRUITS;
type Fruits = 'apple' | 'pear' | 'orange';

// This works
const fruit: Fruits = FRUITS.APPLE;
// This also works
const fruit2: Fruits = 'apple';

该类型将在这些场景中使用,因此两者都必须仍然有效:

const fruit: Fruits = FRUITS.APPLE;

const fruit2: Fruits = 'apple';

我总是建议远离 enum 除非值真的不透明,这意味着你 不需要 需要枚举声明之外的任何 TS 代码来引用 number/string 作为文字值。 (实际上,我倾向于完全远离数字 enum,因为所有 number 值都可以分配给它们,请参阅 microsoft/TypeScript#17734 等问题)

对于您的示例中出现的特定用例,我倾向于放弃 enum 并改用强类型枚举对象:

const FRUITS = {
  APPLE: 'apple',
  PEAR: 'pear',
  ORANGE: 'orange',
} as const;

允许以编程方式定义 Fruits:

type Fruits = typeof FRUITS[keyof typeof FRUITS];

然后您的示例中的所有内容仍然有效:

const fruit: Fruits = FRUITS.APPLE;
const fruit2: Fruits = 'apple';

Playground link to code