枚举相等性检查时出现Typescript编译错误



我创建了这个typescript文件来显示问题:

enum E {
one,
two
}
console.log(E.one)
console.log(E.two)
let n: E = E.one
if (n === E.one) console.log("equal");
if (n === E.two) console.log("equal");

我在第二次收到tsc的编译错误if:

test.ts:11:5 - error TS2367: This condition will always return 'false' since the types 'E.one' and 'E.two' have no overlap.

我不知道为什么会发生这种事。我做错什么了吗?

这是预期行为(请参阅本期(。

TypeScript的控制流分析足够聪明,可以看到您刚刚将E.one分配给了n。现在有"不可见的">n相关联的类型信息,将其类型缩小为E.one,并将导致if语句中的错误,因为它知道条件将始终求值为false

如果你想避免这种行为,你可以使用as运算符,它可以让TypeScript方便地忘记关于n的缩小的类型信息。

let n: E = E.one as E
if (n === E.one) console.log("equal");
if (n === E.two) console.log("equal");

游乐场