在'false'情况下,已区分的并集布尔值标签推断失败

时间:2019-07-09 19:40:06

标签: typescript type-inference discriminated-union

编辑:问题根本不在于使用严格模式,该模式正确禁止了具有null属性的类型,并正确推断了真假情况。

我正在写一个带标签的布尔值的区分联合,但是尝试使用!x.tag作为类型保护符是行不通的。我怀疑原因是因为nullundefined之类的虚假值也将计数,但是将标记类型定义为NonNullable<true>NonNullable<false>却无济于事-我是m仍然可以使用isTrue创建类型为isFalsetag: 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不是。

0 个答案:

没有答案