编辑:问题根本不在于使用严格模式,该模式正确禁止了具有null
属性的类型,并正确推断了真假情况。
我正在写一个带标签的布尔值的区分联合,但是尝试使用!x.tag
作为类型保护符是行不通的。我怀疑原因是因为null
或undefined
之类的虚假值也将计数,但是将标记类型定义为NonNullable<true>
和NonNullable<false>
却无济于事-我是m仍然可以使用isTrue
创建类型为isFalse
或tag: null
的对象。即使在真实情况下,这也会使它无法通过类型防护,因此我不明白自己缺少什么。示例代码:
// definitions:
interface isTrue {
tag: NonNullable<true>;
data: string;
}
interface isFalse {
tag: NonNullable<false>;
data: number;
}
type either = isTrue | isFalse;
// playing around:
const falsy: isFalse = { tag: null, data: 5 }; // would expect this not to be ok but it is
const truthy: isTrue = { tag: null, data: 'a' }; // this is also allowed
decider({ tag: null, data: 4 }) // a legal call since the argument is valid as a isFalse object.
function decider(x: either) {
if (x.tag) { // inferred as isTrue
x.data
x.tag
} else { // still a union
x.data
x.tag
}
}
我还尝试过将!x.tag
放在if
子句中,并将true
的情况留给else
子句,但是在两种情况下,true
子句被推断出,而false
不是。