TypeScript:枚举转换的隐含数字

due*_*l0r 8 casting implicit-cast typescript

为什么以下在TypeScript中编译?

enum xEnum {
  X1,X2
}

function test(x: xEnum) {
}

test(6);
Run Code Online (Sandbox Code Playgroud)

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

这是游乐场的链接.

Fen*_*ton 10

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

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

因此,允许在number和之间进行隐式转换的决定Enum是有意的.

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

function test(x: xEnum) {
    if (typeof xEnum[x] === 'undefined') {
        alert('Bad enum');
    }
    console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

虽然您可能不同意实现,但值得注意的是,枚举在以下三种情况下很有用:

// 1. Enums are useful here:
test(xEnum.X2);

// 2. ...and here
test(yEnum.X2);
Run Code Online (Sandbox Code Playgroud)

3. - 当你输入test(它时会告诉你你可以使用的枚举类型来保证你选择一个存在的类型.