我创建了这个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");
游乐场