Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

! operator in typescript after object method

I have an object X with a method getY() returning an object Y with a method a(), in typescript. What does it mean an expression like this one:

X.getY()!.a() 

I guess the ! operator is used to check against null, but how does it work concretely? Where is defined in the language?

like image 914
user2032922 Avatar asked Aug 10 '16 13:08

user2032922


People also ask

What is !: operator in TypeScript?

August 6, 2020. TypeScript 3.7 added support for the ?? operator, which is known as the nullish coalescing operator. We can use this operator to provide a fallback value for a value that might be null or undefined .

What is '!' In TypeScript?

What is the TypeScript exclamation mark? The non-null assertion operator tells the TypeScript compiler that a value typed as optional cannot be null or undefined . For example, if we define a variable as possibly a string or undefined, the !

What is non-null assertion operator?

Non-null assertion operatorproduces a value of the type of x with null and undefined excluded. Similar to type assertions of the forms <T>x and x as T , the ! non-null assertion operator is simply removed in the emitted JavaScript code. // Compiled with --strictNullChecks.

What is non-null type assertion operator angular?

The Angular non-null assertion operator causes the TypeScript type checker to suspend strict null and undefined checks for a specific property expression. For example, you can assert that item properties are also defined. Often, you want to make sure that any property bindings aren't null or undefined .


2 Answers

It's called the "Non-null assertion operator" and it tells the compiler that x.getY() is not null.

It's a new typescript 2.0 feature and you can read about it in the what's new page, here's what it says:

A new ! post-fix expression operator may be used to assert that its operand is non-null and non-undefined in contexts where the type 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 ! non-null assertion operator is simply removed in the emitted 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 } 

Edit

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

like image 105
Nitzan Tomer Avatar answered Oct 09 '22 22:10

Nitzan Tomer


Non-null assertion operator: !

  • You tells the TS compiler that the value of a variable is not null | undefined
  • Use it when you are in possession of knowledge that the TS compiler lacks.

Here is a trivial example of what it does:

let nullable1: null | number; let nullable2: undefined | string;  let foo  = nullable1! // type foo: number let fooz = nullable2! // type fooz: string 

It basically removes null | undefined from the type


When do I use this?

Typescript is already pretty good at inferring types for example using typeguards:

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

However sometimes we are in a scenario which looks like the following:

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

My personal advice is to try to avoid this operator whenever possible. Let the compiler do the job of statically checking your code. However there are scenarios especially with vendor code where using this operator is unavoidable.

like image 34
Willem van der Veen Avatar answered Oct 09 '22 23:10

Willem van der Veen