为什么永不打字不能用于控制流分析?

时间:2017-09-19 15:39:28

标签: typescript

我有以下构造(使用strictNullChecks):

function neverReturns(): never {
    throw new Error();
}

const maybeString: string | null = Math.random() > 0.5 ? "hi" : null;

if (!maybeString) {
    neverReturns();
    // throw new Error();
}

maybeString.substr(0, 1); // <- Object is possibly 'null'.

当直接在条件中抛出Error时,编译器会发现MaybeString之后不能为null并接受代码。

在调用返回类型为never的函数时,我会期望相同的行为。但是编译器抱怨MaybeString可能是null

是否存在这样的原因,或者这是TypeScript中缺少的功能?

2 个答案:

答案 0 :(得分:1)

您错过了else分支。由于它可能会或可能不会评估!maybeStringtrue。在任何情况下,它都可以通过never返回类型而忘记它。

如果你这样使用它:

if (!maybeString) {
    neverReturns();
} else {
    maybeString.substr(0, 1); // not going to be null
}

然后你的else分支知道它不能再为null了。

答案 1 :(得分:0)

首选解决方法是在调用throw函数时使用return语句:

if (!maybeString) {
    return neverReturns();
}

maybeString.substr(0, 1); // OK