Typescript是否支持? 运营商? (那叫什么?)

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

即:

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

另外,这个操作符有没有更常见的名称(这对谷歌来说是非常困难的)。

我无法在TypeScript语言规范中find任何参考。

就CoffeeScript中调用这个操作符而言,它被称为存在操作符existential operator) (特别是存在操作符的“访问器变体”)。

从CoffeeScript关于操作符的文档 :

存在操作符的访问器变体?. 可以用来吸收一系列属性中的空引用。 使用它来代替点访问器. 在基值可能为未定义的情况下

因此, 存在操作符访问器变体似乎是引用这个操作符的正确方法; 而TypeScript目前似乎不支持它(尽pipe其他人已经expression了对这个function的需求 )。

不如一个单一?,但它的作品:

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

你可以使用任意数量的&&,只要你喜欢:

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

在github上有一个打开的function请求,你可以在这里发表你的意见/要求: https : //github.com/Microsoft/TypeScript/issues/16

我有兴趣阅读这个运算符,速记空检查是非常酷,特别是长链。

TypeScript不支持它,主要是因为JavaScript没有这个function。 目前forms的TypeScript是JavaScript加上一些ECMAScript 6function,再加上一些额外的function(例如很快就会包含generics)。

所以所有的JavaScripts时髦的运营商都可用,包括types转换,如…

 var n: number = +myString; // convert to number var b: bool = !!myString; // convert to bool 

但回到这个问题。 我有一个愚蠢的例子,说明如何在JavaScript中做类似的事情(因此也是TypeScript),尽pipe我绝对不会认为它是一个优雅的特性。

 (foo||{}).bar; 

所以如果foo undefined ,结果是undefined ,如果foo被定义并且有一个名为bar的属性有一个值,那么结果就是该值。

我把一个例子JSFiddle 。

这看起来相当粗略的更长的例子。

 var postCode = ((person||{}).address||{}).postcode; 

编辑:我已经更新了答案感谢fracz评论。

TypeScript 2.0发布!. 这不一样?. (C#中的安全导航器)

看到这个答案的更多细节:

https://stackoverflow.com/a/38875179/1057052

这只会告诉编译器该值不为null或未定义。 这不会检查值是否为空或未定义。

TypeScript非空断言运算符

 // Compiled with --strictNullChecks function validateEntity(e?: Entity) { // Throw exception if e is null or invalid entity } function processEntity(e?: Entity) { validateEntity(e); let s = e!.name; // Assert that e is non-null and access name } 

只要在TypeScript中找不到类似的东西,我使用下面的函数:

 export function o<T>(someObject: T, defaultValue: T = {} as T) : T { if (typeof someObject === 'undefined' || someObject === null) return defaultValue; else return someObject; } 

用法如下所示:

 o(o(o(o(test).level1).level2).level3 

另外,你可以设置一个默认值:

 o(o(o(o(o(test).level1).level2).level3, "none") 

它在Visual Studio中的IntelliSensefunction非常好。

我们在Phonetradr上创build了这个util方法,它可以通过Typescript为您提供types安全的深层属性访问:

 /** * 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);