Matthew Layton
Matthew Layton

Reputation: 42390

TypeScript - null versus undefined

The TypeScript Coding Guidelines state

Use undefined. Do not use null

Having just read another article on ECMAScript, which advocates for null over undefined, I was wondering whether Microsoft’s or the TypeScript team’s rationale is known for this decision?

Upvotes: 17

Views: 9800

Answers (4)

Michael Freidgeim
Michael Freidgeim

Reputation: 28511

From https://palantir.github.io/tslint/rules/no-null-keyword/

Rationale

Instead of having the dual concepts of null andundefined in a codebase, this rule ensures that only undefined is used.

JavaScript originally intended undefined to refer to a value that doesn’t yet exist, while null was meant to refer to a value that does exist but points to nothing. That’s confusing. undefined is the default value when object members don’t exist, and is the return value for newer native collection APIs such as Map.get when collection values don’t exist.

To remove confusion over the two similar values, it’s better to stick with just undefined.

Upvotes: 2

Estus Flask
Estus Flask

Reputation: 223194

No rationale is necessary for guidelines, the requirement could be chosen at random in order to keep the code base consistent.

As for this guideline, undefined takes more characters to type but doesn't need to be explicitly assigned to nullable variable or property:

class Foo {
  bar: number|undefined;
}

function foo(bar: number|undefined) {}

vs.

class Foo {
  bar: number|null = null;
}

function foo(bar: number|null = null) {}

Also, it's less convenient to check the type of null value at runtime because typeof val === 'object' for both null and object value, while it's typeof val === 'undefined' for undefined.

There is relevant TSLint rule that addresses this concern, no-null-keyword.

Upvotes: 17

The Segfault
The Segfault

Reputation: 1040

I made some research few months ago and I came out with the fact that undefined must be prioritize using tslint rule 'no-null-keyword'.

I tried to change my codebase and I had some issues. Why? Because I'm using an API that return null for empty fields.

I struggled because of the tslint triple-equals rule.

if (returnedData === undefined) // will be false because returnedData is null

Which let you 2 options:

1) Add some parameters to your triple-equals rules.

"triple-equals": [true, "allow-null-check"] and do If (returnedData == null)

allow-null-check allow "==" for null

2) Use If (returnedData) instead but it checks if null/undefined/empty string or a zero

Upvotes: 5

Joel Harkes
Joel Harkes

Reputation: 11681

Why use null over undefined?

In javascripts objects are dynamic without any type information. therefor:

var person
person.namme

could either be a misspell or it could be the name property. If you use undefined as null you won't know when debugging if:

  • variable/property is not initialized yet, or
  • you miss typed the property name.

Therefor null is preferable over undefined, you defer between:

  • forgot to initialize property and
  • wrong property used.

That said: Typescript is typed. thus the following code:

var person
person.namme

would result in a type error at compilation. Thus null in that sense is no longer needed.

That said, i still prefer null over undefined.

Upvotes: 2

Related Questions