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

其他回答

现在可以了,请看用户“甜甜圈”的回答。

旧的回答: 关于布尔运算符的标准JavaScript行为可能会有所帮助。布尔方法在比较对象时不返回true或false,但在or情况下,第一个值等于true。

虽然不如单身好,但还是管用的:

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

你可以随心所欲地使用&&:

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

也可以使用默认值:

var name = person && person.name || "Unknown user";

更新:是的,现在支持了!

它刚刚与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

它叫做可选链接,在Typescript 3.7中

可选的链接让我们可以在可以立即停止的地方编写代码 如果遇到null或undefined,运行一些表达式

我们在开发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);

我一般不推荐这种方法(注意性能问题),但是您可以使用扩散操作符来浅克隆一个对象,然后您可以访问该对象上的属性。

 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推断类型的方式可能有一些边缘情况,这不会被编译,但这通常应该是可行的。