外部枚举的用处

1,866 阅读1分钟

本系列作为《TypeScript 入门实战笔记》课程(见拉勾教育)的补丁,随时更新。

Ambient Enums 外部枚举的用途

如课程第 9 讲所说,枚举是 TypeScript 里极其鸡肋的特性,因为枚举类型基本上是仅和自身类型兼容。

但我猜测外部枚举(Ambient Enums)——一种定义其他地方定义过的枚举类型,应该是可以解决(”绕过“)枚举仅和自身兼容的问题。

但 TypeScript 官方文档里除了介绍外部枚举特性之外(一是未指定初始值的外部枚举成员一律当做计算(值)成员,二则是转译成 JavaScript时会擦除外部枚举定义),居然都没有一个靠谱的例子说明这玩意儿究竟有什么用或者说怎么用。但结合其转译时被擦除的特性,大概率只能在类型定义文件 .d.ts 里使用(因为如擦出了 .ts 模块里定义的外部枚举,运行时可以就找不到枚举值了)。

举个示例:

首先定义 types.d.ts:

declare enum A {
  A = "A",
  B = "B"
}

export type CmpA = (ele: A) => boolean;

export {};

然后定义 business.ts:

import { CmpA } from "./types";
enum A {
  A = "A",
  B = "B"
}

// C1: 枚举类型兼容了
const c: CmpA = (ele: A) => {
  switch (ele) {
    case A.A:
      return true;
    default:
      return false;
  }
};
export {};

如 business.ts C1 注释处所示:用到枚举 A 的匿名箭头函数可以赋值给类型是 CmpA 的变量 c,即是说外部枚举和枚举 A 是兼容的。所以这就是我所理解的外部枚举的作用和用法。

codesandbox playground