在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
,如果someObject
是null
/undefined
,则没有错误,但如果someObject.someProperty
是null
/undefined
,则会出现错误,您可以执行:
const myValue = someObject?.someProperty.someProperty;
有了这个:
- 如果
someObject
是null
或undefined
,则myValue
将获得值undefined
- 如果
someObject
不是null
或undefined
,但someObject.someProperty
是null
或undefined
,则会出现错误,因为我们在第一个someProperty
之后没有使用?.
- 如果
someObject
和someObject.someProperty
都不是null
或undefined
,则myValue
将得到查找someObject.someProperty.someProperty
的结果
如果您有兴趣在一行中抛出错误,可以将其封装在一个立即调用的函数表达式中:
const test = null ?? (() => {throw new Error("Test is nullish")})();