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