! 在对象方法之后的类型脚本中的运算符

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

X.getY()!.a()

我想 !操作符是用来检查 null 的,但是它具体是如何工作的呢?语言在哪里定义?

101414 次浏览

它被称为“非空断言操作符”,它告诉编译器 x.getY()不为空。

这是一个新的打字脚本2.0功能,你可以在 最新消息页面上阅读,这里是它说:

可以使用一个新的! post-fix 表达式操作符断言其 操作数在类型为 checker is unable to conclude that fact. Specifically, the operation x! produces a value of the type of x with null and undefined excluded. Similar to type assertions of the forms x and x as T, the ! 非空断言操作符在发出的 JavaScript code.

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

剪辑

记录这个特性有一个问题: 记录非空断言操作符(!)

非空断言操作符: !

  • 告诉 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


我什么时候用这个?

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

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')
}
}

我个人的建议是尽可能避免这个操作员。让编译器执行静态检查代码的工作。然而,在某些情况下,特别是在供应商代码中,使用这个操作符是不可避免的。