如何在内联中检查null值并在typescript中抛出错误



在C#中,我可以编写代码来检查空引用,并在抛出自定义异常的情况下,例如:

var myValue = (someObject?.SomeProperty ?? throw new Exception("...")).SomeProperty;

在最近的更新中,TypeScript引入了null合并运算符??但是像上面的语句一样使用它会产生编译错误。TypeScript中是否有类似的允许语法?


为了澄清,使用以下代码可以实现所需的行为:

if(someObject?.someProperty == null) {
throw new Error("...");
}
var myValue = someObject.someProperty.someProperty;

代码:

var myValue = someObject?.someProperty.someProperty;

逻辑上工作正常,但抛出一个意义不大的异常。

只要TypeScript本身不支持这一点,就可以编写类似于以下的函数:

function throwExpression(errorMessage: string): never {
throw new Error(errorMessage);
}

这将允许您抛出一个错误作为表达式:

const myString = nullableVariable ?? throwExpression("nullableVariable is null or undefined")
语法错误的原因是throw是一条语句,因此不能将其用作运算符的操作数。

有一个针对throw表达式的JavaScript提案正在TC39过程中工作,目前处于第2阶段。如果它进入第三阶段,你可以预期它很快就会出现在TypeScript中。(2020年底更新:然而,它似乎已经停滞了,在2018年1月被一名TC39成员阻止了,他认为如果我们有do表达式,他们就没有足够的动力……注意,到2020年底,do表达式仍然是第一阶段,但至少它们在6月提交给了TC39。(

使用throw表达式,您可以编写以下内容(如果您想要someObject.someProperty的值(:

const myValue = someObject?.someProperty ?? throw new Error("custom error here");

或者,如果你想要someObject.someProperty.someProperty(我认为你的C#版本就是这样(:

const myValue = (someObject?.someProperty ?? throw new Error("custom error here")).someProperty;

有一个巴别塔插件,你现在可以使用了。这是上面关于Babel的REPL的第一个例子。


旁注:你说过你想抛出自定义错误,但对于阅读本文的其他人来说,如果不需要自定义错误:

如果您想要someObject.someProperty.someProperty,如果someObjectnull/undefined,则没有错误,但如果someObject.somePropertynull/undefined,则会出现错误,您可以执行:

const myValue = someObject?.someProperty.someProperty;

有了这个:

  • 如果someObjectnullundefined,则myValue将获得值undefined
  • 如果someObject不是nullundefined,但someObject.somePropertynullundefined,则会出现错误,因为我们在第一个someProperty之后没有使用?.
  • 如果someObjectsomeObject.someProperty都不是nullundefined,则myValue将得到查找someObject.someProperty.someProperty的结果

如果您有兴趣在一行中抛出错误,可以将其封装在一个立即调用的函数表达式中:

const test = null ?? (() => {throw new Error("Test is nullish")})();

相关内容

  • 没有找到相关文章