Typescript目前(或计划)是否支持安全导航操作符?。
ie:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
Typescript目前(或计划)是否支持安全导航操作符?。
ie:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
当前回答
还没有(截至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个月左右就会过时,但希望它能同时帮助到一些人。
其他回答
它叫做可选链接,在Typescript 3.7中
可选的链接让我们可以在可以立即停止的地方编写代码 如果遇到null或undefined,运行一些表达式
是的。从TypeScript 3.7(2019年11月5日发布)开始,这个特性就被支持了,被称为可选链接:
在其核心,可选的链接让我们编写的代码中,TypeScript可以立即停止运行一些表达式,如果我们遇到一个null或未定义。可选连锁的明星是新的?操作符用于可选属性访问。
更多细节请参考TypeScript 3.7发布说明。
在3.7版本之前,TypeScript中不支持这一点,尽管早在TypeScript回购的第16个问题(可以追溯到2014年)中就已经请求过了。
至于如何称呼这个运算符,似乎还没有达成共识。除了“可选链接”(这也是它在JavaScript和Swift中被称为的),还有其他一些例子:
CoffeeScript将其称为存在操作符(具体来说,是存在操作符的“访问变量”):
存在操作符的访问变量?可用于吸收属性链中的空引用。使用它代替点访问器。在基值可能为空或未定义的情况下。
c#将其称为空条件操作符。
空条件操作符应用成员访问?。,或元素访问,?[],仅当该操作数的计算结果为非空时才对其操作数进行操作;否则,返回null。
Kotlin将其称为安全调用运算符。
可能还有很多其他的例子。
_。get(obj, 'address.street.name')适用于没有类型的JavaScript。但是对于TypeScript,我们需要真正的Elvis操作符!
还没有(截至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