TypeScript:枚举转换的隐含数字

时间:2014-09-10 10:15:51

标签: casting typescript implicit-cast

为什么以下在TypeScript中编译?

enum xEnum {
  X1,X2
}

function test(x: xEnum) {
}

test(6);

不应该抛出错误吗?恕我直言这个隐式演员在这里是错的,没有?

这是playground link

2 个答案:

答案 0 :(得分:9)

这是语言规范(3.2.7枚举类型)的一部分:

  

枚举类型可分配给Number基本类型,副   反之亦然,但不同的枚举类型不能彼此分配

因此,允许在numberEnum之间进行隐式转换的决定是反过来的。

这意味着您需要确保该值有效。

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)