假设我想确保myKey在{ myKey: '' }只包含字符串foo,bar,baz,我可以通过两种方式实现这一目标.
// with a String Literal Type
type MyKeyType = 'foo' | 'bar' | 'baz';
// or with a String Enum
enum MyKeyType {
FOO = 'foo',
BAR = 'bar',
BAZ = 'baz'
}
Run Code Online (Sandbox Code Playgroud)
我想知道其中一个的利弊在哪里,因为两个看起来都是一样的(从我访问例如条件检查的值的方式来看).
我在TS文档中发现的唯一区别是Enums是运行时的真实对象,在某些情况下可能是可取的.
Rya*_*ugh 20
要理解的关键是字符串枚举的值是不透明的.
字符串枚举的预期用例是您不希望其他代码知道或关心文字字符串支持的MyKeyType.FOO内容.这意味着您将无法将文字字符串 "bar"传递给接受的函数MyKeyType- 您必须改为编写MyKeyType.BAR.
Dan*_*l R 10
嗯,在转译的代码中,字符串枚举和文字类型之间存在差异。
比较打字稿代码
// with a String Literal Type
type MyKeyType1 = 'foo' | 'bar' | 'baz';
// or with a String Enum
enum MyKeyType2 {
FOO = 'foo',
BAR = 'bar',
BAZ = 'baz'
}
Run Code Online (Sandbox Code Playgroud)
使用转译的JavaScript代码
// or with a String Enum
var MyKeyType2;
(function (MyKeyType2) {
MyKeyType2["FOO"] = "foo";
MyKeyType2["BAR"] = "bar";
MyKeyType2["BAZ"] = "baz";
})(MyKeyType2 || (MyKeyType2 = {}));
Run Code Online (Sandbox Code Playgroud)
您会看到的是,没有为字符串文字生成任何代码。因为Typescripts Transpiler仅在编译时用于类型安全。在运行时,字符串文字会“生成为哑”字符串。文字的定义和用法之间没有引用。
因此,存在第三种替代方法,称为const枚举
看这个
// with a String Literal Type
type MyKeyType1 = 'foo' | 'bar' | 'baz';
// or with a String Enum
enum MyKeyType2 {
FOO = 'foo',
BAR = 'bar',
BAZ = 'baz'
}
// or with a Const String Enum
const enum MyKeyType3 {
FOO = 'foo',
BAR = 'bar',
BAZ = 'baz'
}
var a : MyKeyType1 = "bar"
var b: MyKeyType2 = MyKeyType2.BAR
var c: MyKeyType3 = MyKeyType3.BAR
Run Code Online (Sandbox Code Playgroud)
将被转译为
// or with a String Enum
var MyKeyType2;
(function (MyKeyType2) {
MyKeyType2["FOO"] = "foo";
MyKeyType2["BAR"] = "bar";
MyKeyType2["BAZ"] = "baz";
})(MyKeyType2 || (MyKeyType2 = {}));
var a = "bar";
var b = MyKeyType2.BAR;
var c = "bar" /* BAR */;
Run Code Online (Sandbox Code Playgroud)
要进一步播放,您可以检查此链接
我更喜欢使用const枚举,因为键入Enum.Value的便捷方式。在编译时,Typescript会为我做剩下的事情,以获得最高的性能。
开发时枚举的一个好处是,您可以通过智能感知轻松看到选项列表:
同样,您可以使用重构工具轻松地更改枚举值,而不用在各处更改字符串。
编辑:在VS 2017和TypeScript> = 3.2.4中,intellisense使用字符串文字类型:
枚举的一个很大的缺点是,如果您使用数字而不是字符串,那么在我看来,整个枚举并不安全:我总是可以将任何数字值分配给此类变量
enum TYPE {MAN = 1, WOMAN = 2, BOY = 3, GIRL = 4};
let foo: TYPE = TYPE.MAN;
foo = 37.14; //no problem for compiler
Run Code Online (Sandbox Code Playgroud)
使用枚举而不是字符串文字的好处之一是,您也可以在未声明类型的地方使用它。
例如 -
assert.equal(result.keyType, KeyType.FOO)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3897 次 |
| 最近记录: |