为什么以下在TypeScript中编译?
enum xEnum {
X1,X2
}
function test(x: xEnum) {
}
test(6);
不应该抛出错误吗?恕我直言这个隐式演员在这里是错的,没有?
答案 0 :(得分:9)
这是语言规范(3.2.7枚举类型)的一部分:
枚举类型可分配给Number基本类型,副 反之亦然,但不同的枚举类型不能彼此分配
因此,允许在number
和Enum
之间进行隐式转换的决定是反过来的。
这意味着您需要确保该值有效。
function test(x: xEnum) {
if (typeof xEnum[x] === 'undefined') {
alert('Bad enum');
}
console.log(x);
}
虽然你可能不同意这个实现,但值得注意的是enums在这三种情况下都很有用:
// 1. Enums are useful here:
test(xEnum.X2);
// 2. ...and here
test(yEnum.X2);
和3. - 当您输入test(
时,它会告诉您可以使用的枚举类型,以保证您选择一个存在的类型。
答案 1 :(得分:1)
不,不应该。这里没有类型转换,它们后面的基类型都是相同的整数。
typescript enum type checking works fine
您的投诉是关于范围值,在这种情况下,与类型检查无关。
enum is a flexible set of constants
enum xEnum {X1=6, X2} // ruins it for test(0)