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

ie:

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

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


当前回答

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

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

其他回答

我一般不推荐这种方法(注意性能问题),但是您可以使用扩散操作符来浅克隆一个对象,然后您可以访问该对象上的属性。

 const person = { personId: 123, firstName: 'Simon' };
 const firstName = { ...person }.firstName;

这是可行的,因为'firstName'类型是通过'传播'的。

我将使用这个最频繁的时候,我有一个find(…)表达式,可以返回null,我需要一个单一的属性从它:

 // this would cause an error (this ID doesn't exist)
 const people = [person];
 const firstName2 = people.find(p => p.personId == 999).firstName;

 // this works - but copies every property over so raises performance concerns
 const firstName3 = { ...people.find(p => p.personId == 999) }.firstName;

typescript推断类型的方式可能有一些边缘情况,这不会被编译,但这通常应该是可行的。

还没有(截至2019年9月),但由于“安全导航操作符”现在处于第3阶段,所以它正在TypeScript中实现。

关注这个问题的更新:

https://github.com/microsoft/TypeScript/issues/16

有几个引擎有早期的实现:

股份公司: https://bugs.webkit.org/show_bug.cgi?id=200199

V8: https://bugs.chromium.org/p/v8/issues/detail?id=9553

SM: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143

(通过https://github.com/tc39/proposal-optional-chaining/issues/115问题——475422578)

你现在可以安装一个插件来支持它:

npm install --save-dev ts-optchain

在tsconfig.json中:

// tsconfig.json
{
    "compilerOptions": {
        "plugins": [
            { "transform": "ts-optchain/transform" },
        ]
    },
}

我希望这个答案在未来6个月左右就会过时,但希望它能同时帮助到一些人。

终于来了!

下面是一些例子:

// 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

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

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

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