Typescript目前(或计划)是否支持安全导航操作符?。

ie:

var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;

此外,这个操作符是否有更常见的名称(很难为谷歌)。


当前回答

_。get(obj, 'address.street.name')适用于没有类型的JavaScript。但是对于TypeScript,我们需要真正的Elvis操作符!

其他回答

是的。从TypeScript 3.7(2019年11月5日发布)开始,这个特性就被支持了,被称为可选链接:

在其核心,可选的链接让我们编写的代码中,TypeScript可以立即停止运行一些表达式,如果我们遇到一个null或未定义。可选连锁的明星是新的?操作符用于可选属性访问。

更多细节请参考TypeScript 3.7发布说明。


在3.7版本之前,TypeScript中不支持这一点,尽管早在TypeScript回购的第16个问题(可以追溯到2014年)中就已经请求过了。

至于如何称呼这个运算符,似乎还没有达成共识。除了“可选链接”(这也是它在JavaScript和Swift中被称为的),还有其他一些例子:

CoffeeScript将其称为存在操作符(具体来说,是存在操作符的“访问变量”):

存在操作符的访问变量?可用于吸收属性链中的空引用。使用它代替点访问器。在基值可能为空或未定义的情况下。

c#将其称为空条件操作符。

空条件操作符应用成员访问?。,或元素访问,?[],仅当该操作数的计算结果为非空时才对其操作数进行操作;否则,返回null。

Kotlin将其称为安全调用运算符。

可能还有很多其他的例子。

现在可以了,请看用户“甜甜圈”的回答。

旧的回答: 关于布尔运算符的标准JavaScript行为可能会有所帮助。布尔方法在比较对象时不返回true或false,但在or情况下,第一个值等于true。

虽然不如单身好,但还是管用的:

var thing = foo && foo.bar || null;

你可以随心所欲地使用&&:

var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;

也可以使用默认值:

var name = person && person.name || "Unknown user";

我们在开发Phonetradr时创建了这个util方法,它可以让你以类型安全的方式访问Typescript的深层属性:

/** * Type-safe access of deep property of an object * * @param obj Object to get deep property * @param unsafeDataOperation Function that returns the deep property * @param valueIfFail Value to return in case if there is no such property */ export function getInSafe<O,T>(obj: O, unsafeDataOperation: (x: O) => T, valueIfFail?: any) : T { try { return unsafeDataOperation(obj) } catch (error) { return valueIfFail; } } //Example usage: getInSafe(sellTicket, x => x.phoneDetails.imeiNumber, ''); //Example from above getInSafe(foo, x => x.bar.check, null);

它叫做可选链接,在Typescript 3.7中

可选的链接让我们可以在可以立即停止的地方编写代码 如果遇到null或undefined,运行一些表达式

终于来了!

下面是一些例子:

// properties
foo?.bar
foo?.bar()
foo?.bar.baz()
foo?.bar?.baz()

// indexing
foo?.[0]
foo?.['bar']

// check if a function is defined before invoking
foo?.()
foo.bar?.()
foo?.bar?.()

但这和你的假设不完全一样。

而不是评估

foo?.bar

对于这个我们都习惯编写的小代码片段

foo ? foo.bar : null

它的值实际上是

(foo === null || foo === undefined) ?
    undefined :
    foo.bar

它适用于所有假值,如空字符串,0或false。

我只是没有一个解释,为什么他们不编译为foo == null