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

ie:

var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : 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推断类型的方式可能有一些边缘情况,这不会被编译,但这通常应该是可行的。

其他回答

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

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

猫王(? ?)可选的链接操作符在TypeScript 3.7中被支持。

你可以用它来检查空值:cats?如果cats为null或未定义,Miows将返回null。

你也可以将它用于可选方法调用:cats.doMiow?(5)将调用doMiow如果它存在。

属性访问也是可能的:猫?.['喵']。

参考:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/

我觉得这就是你要找的东西。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);

_。get(obj, 'address.street.name')适用于没有类型的JavaScript。但是对于TypeScript,我们需要真正的Elvis操作符!

终于来了!

下面是一些例子:

// 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