• 作者:老汪软件技巧
  • 发表时间:2024-09-10 10:00
  • 浏览量:

开始之前,先看一些常见的 TypeScript 以及编译时 tsc 的结果。

// TypeScript
const first = 1;
const second = 2;
console.log(first + second);
// Compiled
"use strict";
const first = 1;
const second = 2;
console.log(first + second);

这里需要明确一个点:常量不仅最终会占用编译包中的空间,而且还需要在代码运行时由 JavaScript 引擎解析/运行。

场景一

在平常的项目开发中,喜欢使用枚举enum,这是非常好的习惯,它会增加项目的可读性等。

但是我要发出一个问题,你真的理解枚举吗?请仔细看完下面这个例子。

enum Constants {
    First = 1,
    Second = 2
}
const enum Constants {
    First = 1,
    Second = 2
}

上面两者有何区别?

我们先来看一下常量枚举的编译结果:

// TypeScript
enum Constants {
    First = 1,
    Second = 2
}
console.log(Constants.First + Constants.Second);
// Compiled
"use strict";
var Constants;
(function (Constants) {
    Constants[Constants["First"] = 1] = "First";
    Constants[Constants["Second"] = 2] = "Second";
})(Constants || (Constants = {}));
console.log(Constants.First + Constants.Second);

在看一下const enum的编辑结果:

// TypeScript
const enum Constants {
    First = 1,
    Second = 2
}
console.log(Constants.First + Constants.Second);
// Compiled
"use strict";
console.log(1 /* First */ + 2 /* Second */);

结果就是:

const enum 编译结果要小得多!在加上压缩,那么运行时它最终可能会成为本例中的最小代码体积(console.log(1+2) 或 console.log(3))

也就是const enum 比起常规 enum 编译之后的代码体积要小很多很多,那我们就可以一直使用const enum 了吗?我们继续看下一个场景。

场景二

再来看一段代码,例如我们想用枚举定义一个常量,但是这个常量的值很长很长,我们来看一下编译前后:

// TypeScript
const enum Constants {
    Long = 'a very long string'
}
console.log(Constants.Long);
console.log(Constants.Long);
console.log(Constants.Long);
// Compiled
"use strict";
console.log("a very long string" /* Long */);
console.log("a very long string" /* Long */);
console.log("a very long string" /* Long */);

那我在想我要是换成一个常量呢?

// TypeScript
const long = 'a very long string';
console.log(long);
console.log(long);
console.log(long);
// Compiled
"use strict";
const long = 'a very long string';
console.log(long);
console.log(long);
console.log(long);

显然我们使用const常量打完包之后的体积更小。

总结

通过上面的两个场景说明,希望你能更深入的理解enum时,能更好的掌握使用场景。

当你使用常规枚举或者枚举值很大的时候一定要留意,它可能对你的打包体积造成一定的影响