!对象方法后的操作符

时间:2016-08-10 13:32:24

标签: object typescript operators

我有一个对象X,其方法getY()在typescript中返回一个方法Y的对象a()。 这样的表达是什么意思:

X.getY()!.a()

我猜!运算符用于检查null,但具体如何工作?在语言中定义的位置?

2 个答案:

答案 0 :(得分:50)

它被称为"非空断言运算符"它告诉编译器x.getY()不为空。

这是一个新的打字稿2.0功能,您可以在what's new页面中阅读相关内容,其中包含:

  

一个新的! post-fix表达式运算符可用于断言它的   操作数在类型的上下文中是非null且非undefined   检查员无法得出结论。具体来说,操作   X!生成x类型的值,其中包含null和undefined。   类似于形式x和x的类型断言为T,!   非空断言运算符只是在发出的中删除   JavaScript代码。

// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
    // Throw exception if e is null or invalid entity
}

function processEntity(e?: Entity) {
    validateEntity(e);
    let s = e!.name;  // Assert that e is non-null and access name
}

修改

There's an issue for documenting this feature: Document non-null assertion operator (!)

答案 1 :(得分:2)

非空断言运算符:!

  • 您告诉 TS 编译器变量的值不是 null | undefined
  • 当您拥有 TS 编译器所缺乏的知识时使用它。

这是一个简单的例子:

let nullable1: null | number;
let nullable2: undefined | string;

let foo  = nullable1! // type foo: number
let fooz = nullable2! // type fooz: string

它基本上从类型中删除了 null | undefined


我什么时候使用它?

Typescript 已经非常擅长推断类型,例如使用 typeguards:

let nullable: null | number | undefined;

if (nullable) {
    const foo = nullable; // ts can infer that foo: number, since if statements checks this
}

但是有时我们会遇到如下情况:

type Nullable = null | number | undefined;

let nullable: Nullable;

validate(nullable);

// Here we say to ts compiler:
// I, the programmer have checked this and foo is not null or undefined
const foo = nullable!;  // foo: number

function validate(arg: Nullable) {
    // normally usually more complex validation logic
    // but now for an example
    if (!arg) {
        throw Error('validation failed')
    }
}

我个人的建议是尽可能避免使用此运算符。让编译器完成静态检查您的代码的工作。但是,在某些情况下,尤其是对于供应商代码,使用此运算符是不可避免的。