【发布时间】:2021-08-20 07:32:03
【问题描述】:
我们可以使用如下文字类型轻松限制支持的值
type GenderConfig = {
gender: 1 | 0
}
const obj: GenderConfig = {
gender: 100 // throw error because value is not 1 or 0
}
现在我想尽可能避免使用幻数1 & 0
所以我尝试为它定义一个枚举
enum Gender {
MALE= 1,
FEMALE=0,
}
type GenderConfig = {
gender: Gender
}
const obj: GenderConfig = {
gender: 100 // This doesn't throw error anymore?
}
令人惊讶的是,gender: 100 不再抛出我不明白其背后原理的错误?
【问题讨论】:
-
枚举几乎在所有语言中都有这个问题。这是因为 enum 在一天结束时只是一个命名数字。因此,如果您说某事是某种枚举,那并不会真正阻止您直接使用整数。或不同的整数。或解析为整数的表达式(在编译时不知道是哪一个)。 Java 使枚举成为一种适当的类型,因此它们是不同的,而不是一些带有名称的整数。 TS 反而使枚举只是命名为数字或字符串。
-
当你希望它成为枚举的一部分时,你没有理由在性别中输入一个数字。正如@VLAZ 指出的那样,枚举仅用于命名数字的目的。因此,无论值是什么,枚举的使用都将分配一个数字。因此,如果您创建了一个新人,那么您可以写:
gender: Gender.MALE以使该人成为男人。无论您的代码如何处理男性(他们可能是或更改为多少)。因此枚举用于分配数字或保持它们一致 - 而不是像您的第一个示例中那样限制。 -
如果您不需要能够在遗留代码中使用 0 和 1,您可以使枚举字符串值
enum Gender {MALE= "MALE",FEMALE="FEMALE"}不那么好,但它会强制调用const obj: GenderConfig = {gender: Gender.MALE }可能不会适合你的情况,但我想我会提到它以防万一 \o/ -
@RasmusLauridsen:我理解你的观点,但我有点不同意。 TypeScript 的唯一目的是为 JS 提供类型安全特性,由于
enums是它们带来的特性之一,所以我认为允许它执行类型检查是公平的
标签: javascript typescript enums