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;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
当前回答
_。get(obj, 'address.street.name')适用于没有类型的JavaScript。但是对于TypeScript,我们需要真正的Elvis操作符!
其他回答
猫王(? ?)可选的链接操作符在TypeScript 3.7中被支持。
你可以用它来检查空值:cats?如果cats为null或未定义,Miows将返回null。
你也可以将它用于可选方法调用:cats.doMiow?(5)将调用doMiow如果它存在。
属性访问也是可能的:猫?.['喵']。
参考:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
更新:是的,现在支持了!
它刚刚与TypeScript 3.7一起发布:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
它被称为可选链接:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
有以下内容:
let x = foo?.bar.baz();
等价于:
let x = (foo === null || foo === undefined) ?
undefined :
foo.bar.baz();
旧的答案
在github上有一个开放的功能请求,你可以在那里发表你的意见/愿望:https://github.com/Microsoft/TypeScript/issues/16
终于来了!
下面是一些例子:
// 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 2.0版本中不支持。
所以我使用下面的函数:
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(test).prop1).prop2
另外,你可以设置一个默认值:
o(o(o(o(test).prop1).prop2, "none")
它与Visual Studio中的智能感知一起工作得非常好。
我们在开发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);