我有以下构造(使用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中缺少的功能?
答案 0 :(得分:1)
您错过了else
分支。由于它可能会或可能不会评估!maybeString
到true
。在任何情况下,它都可以通过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