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;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
当前回答
我们在开发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);
其他回答
终于来了!
下面是一些例子:
// 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
我觉得这就是你要找的东西。Powerbite也有类似的例子
/**
* 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);
操作员吗?。在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中的智能感知一起工作得非常好。
是的。从TypeScript 3.7(2019年11月5日发布)开始,这个特性就被支持了,被称为可选链接:
在其核心,可选的链接让我们编写的代码中,TypeScript可以立即停止运行一些表达式,如果我们遇到一个null或未定义。可选连锁的明星是新的?操作符用于可选属性访问。
更多细节请参考TypeScript 3.7发布说明。
在3.7版本之前,TypeScript中不支持这一点,尽管早在TypeScript回购的第16个问题(可以追溯到2014年)中就已经请求过了。
至于如何称呼这个运算符,似乎还没有达成共识。除了“可选链接”(这也是它在JavaScript和Swift中被称为的),还有其他一些例子:
CoffeeScript将其称为存在操作符(具体来说,是存在操作符的“访问变量”):
存在操作符的访问变量?可用于吸收属性链中的空引用。使用它代替点访问器。在基值可能为空或未定义的情况下。
c#将其称为空条件操作符。
空条件操作符应用成员访问?。,或元素访问,?[],仅当该操作数的计算结果为非空时才对其操作数进行操作;否则,返回null。
Kotlin将其称为安全调用运算符。
可能还有很多其他的例子。
我一般不推荐这种方法(注意性能问题),但是您可以使用扩散操作符来浅克隆一个对象,然后您可以访问该对象上的属性。
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推断类型的方式可能有一些边缘情况,这不会被编译,但这通常应该是可行的。