打字稿安全导航操作符(?.)或(!.)和null属性路径

Eme*_*een 82 typescript

Angular2模板具有安全的运算符(?.),但在component.ts(typescript 2.0)中.安全导航操作员(!)无法正常工作.

例:

这个TypeScript

if (a!.b!.c) { }
Run Code Online (Sandbox Code Playgroud)

编译到这个JavaScript

if (a.b.c) { }
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我得到以下错误:

无法读取未定义的属性'b'

还有其他选择:

if (a && a.b && a.b.c) { }
Run Code Online (Sandbox Code Playgroud)

Prz*_*ski 126

自 TypeScript 3.7 发布以来,您现在可以使用可选链。

属性示例:

let x = foo?.bar.baz();
Run Code Online (Sandbox Code Playgroud)

这相当于:

let x = (foo === null || foo === undefined) ?
    undefined :
    foo.bar.baz();
Run Code Online (Sandbox Code Playgroud)

此外,您可以致电:

可选电话

function(otherFn: (par: string) => void) {
   otherFn?.("some value");
}
Run Code Online (Sandbox Code Playgroud)

仅当 otherFn 不等于 null 或 undefined 时才会调用 otherFn

在 IF 语句中使用可选链

这个:

if (someObj && someObj.someProperty) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在可以用这个替换

if (someObj?.someProperty) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

参考 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

  • @Scaramouche 这是因为可选链接运算符(`?.`)是在 3.7 中引入的,而您正在运行 3.5.3。在 3.7 之前的版本中,TypeScript 假定 `?` 以简写 if 形式使用 (`foo ? bar : baz`),因此需要表达式的其余部分 (4认同)

Ale*_* L. 111

目前在打字稿中没有安全的导航操作员(仍在讨论中).

!.是非空断言运算符 - 它只是说键入检查器,确定它a不是nullundefined.

更多信息在这里

  • 对于那些有兴趣检查这个状态的人.一旦ECMAScript添加支持,TypeScript就会计划添加它.ECMAScript正在跟踪此问题[这里](https://github.com/tc39/proposal-optional-chaining). (12认同)
  • 这太酷了 - 我不知道你可以用它来进行函数调用。正在寻找解决方案并遇到您的答案,所以谢谢您! (2认同)

NaN*_*NaN 22

您可以尝试编写这样的自定义函数.

该方法的主要优点是类型检查和部分智能感知.

export function nullSafe<T, 
    K0 extends keyof T, 
    K1 extends keyof T[K0],
    K2 extends keyof T[K0][K1],
    K3 extends keyof T[K0][K1][K2],
    K4 extends keyof T[K0][K1][K2][K3],
    K5 extends keyof T[K0][K1][K2][K3][K4]>
    (obj: T, k0: K0, k1?: K1, k2?: K2, k3?: K3, k4?: K4, k5?: K5) {
    let result: any = obj;

    const keysCount = arguments.length - 1;
    for (var i = 1; i <= keysCount; i++) {
        if (result === null || result === undefined) return result;
        result = result[arguments[i]];
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

和用法(最多支持5个参数,可以扩展):

nullSafe(a, 'b', 'c');
Run Code Online (Sandbox Code Playgroud)

操场上的例子.


Tia*_*anM 15

使用外部库另一个替代方案是_.has()Lodash.

例如

_.has(a, 'b.c')
Run Code Online (Sandbox Code Playgroud)

等于

(a && a.b && a.b.c)
Run Code Online (Sandbox Code Playgroud)

  • 但它如何与TypeScript的类型推断一起使用? (3认同)
  • 它不适用于打字稿类型推断 (3认同)