Object ! 对象方法之后的typescript中的运算符

Object ! 对象方法之后的typescript中的运算符,object,typescript,operators,Object,Typescript,Operators,我有一个对象X,方法是getY()返回一个对象Y,方法是a(),在typescript中。 像这样的表达是什么意思: X.getY()!.a() 我猜是运算符用于检查null,但它具体是如何工作的?在语言中定义了Where?它被称为“非空断言运算符”,它告诉编译器x.getY()不是空的 这是一个新的typescript 2.0功能,您可以在页面中阅读,下面是它的说明: 一个新的!post fix表达式运算符可用于断言其 操作数在类型为 核查人员无法得出那个事实的结论。具体来说,是行动 x!生

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

X.getY()!.a()
我猜是
运算符用于检查null,但它具体是如何工作的?在语言中定义了Where?

它被称为“非空断言运算符”,它告诉编译器
x.getY()
不是空的

这是一个新的typescript 2.0功能,您可以在页面中阅读,下面是它的说明:

一个新的!post fix表达式运算符可用于断言其 操作数在类型为 核查人员无法得出那个事实的结论。具体来说,是行动 x!生成x类型的值,并排除null和undefined。 与形式x和x as T的类型断言类似! 只需在发出的声明中删除非null断言运算符 JavaScript代码


编辑

非空断言运算符:!
  • 您告诉TS编译器变量的值不是
    null |未定义的
  • 在掌握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')
    }
}

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

wow。我大概写了两千遍
e&&e.name
。thanks@Tope不要将其与其他语言(a?.b?.c?.d?)的“空安全运算符”混淆。这只是告诉typescript编译器一个变量不是空的,它可能是假的,并且它会在运行时崩溃。它的一个好的用例是什么?因为如果我必须检查空值,这不符合目的吗?@StLia如果你确定某个东西不是空值,并且你不想/不需要检查空值,那该怎么办?@Rishav是的,关于(javascript)可选链接操作符,你是对的,关于(typescript)非空断言操作符,你也是对的。但它们的含义也完全不同。第一个说“我不确定,它可以为null,但如果不确定,请继续……”但后一个说“我100%确定它不是null”。
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')
    }
}