wangdoc / typescript-tutorial

TypeScript 教程
https://wangdoc.com/typescript
2.43k stars 256 forks source link

关于 Enum 类型的编译结果疑问 #72

Closed leinad59 closed 1 year ago

leinad59 commented 1 year ago

原文:

Enum 结构的特别之处在于,它既是一种类型,也是一个值。绝大多数 TypeScript 语法都是类型语法,编译后会全部去除,但是 Enum 结构是一个值,编译后会变成 JavaScript 对象,留在代码中。

// 编译前
enum Color {
  Red,     // 0
  Green,   // 1
  Blue     // 2
}

// 编译后
let Color = {
  Red: 0,
  Green: 1,
  Blue: 2
};

然而,这里的 Color 符合文末的“反向映射”中的内容:

数值 Enum 存在反向映射,即可以通过成员值获得成员名。

TypeScript playground 的编译结果符合反向映射中的结果:

"use strict";
var Color;
(function (Color) {
    Color[Color["Red"] = 0] = "Red";
    Color[Color["Green"] = 1] = "Green";
    Color[Color["Blue"] = 2] = "Blue"; // 2
})(Color || (Color = {}));

所以前面的“编译后”内容是否可以认为是不准确的?

ruanyf commented 1 year ago

前面的编译结果是一个简化版本,有利于读者理解。如果不考虑反向映射,就是这个结果。