Sling Academy
Home/TypeScript/Null and Undefined in TypeScript: A Practical Guide

Null and Undefined in TypeScript: A Practical Guide

Last updated: January 08, 2024

Introduction

TypeScript, a superset of JavaScript, offers enhanced type-checking, leading to more robust code bases. Understanding how TypeScript handles ‘null’ and ‘undefined’ types is crucial for developers to write error-free applications. This guide walks you through the practical nuances of these types.

Understanding Null and Undefined

In TypeScript, both ‘null’ and ‘undefined’ can signify the absence of a value, but they are used differently. ‘Undefined’ is the default value for uninitialized variables, while ‘null’ is often used to represent an intentional absence of any object value.

let variableOne: string;
console.log(variableOne); // Output: undefined

let variableTwo: string | null = null;
console.log(variableTwo); // Output: null

Working with Null and Undefined

When declaring variables in TypeScript, you can use union types to specify that a variable can be ‘null’ or ‘undefined’.

let variableThree: string | null | undefined;
variableThree = 'A string';
variableThree = null;
variableThree = undefined;

This flexibility allows functions to indicate optional parameters and even the potential absence of a return value.

function getOptionalValue(): string | undefined {
    // Some logic that might not return a string
    return undefined;
}

function processSomething(value: string | null) {
    // Process knowing that value can be explicitly null
}

Type Guards and Null Checks

Type guards are a fundamental concept in TypeScript that allows for conditional code execution based on type. Using strict null checks, developers can avoid common runtime errors.

if (variableThree !== null && variableThree !== undefined) {
    console.log('variableThree is a string.');
}

Nullish Coalescing and Optional Chaining

Recent versions of TypeScript introduce nullish coalescing and optional chaining, providing more elegant syntax for dealing with ‘null’ and ‘undefined’.

let variableFour: string | undefined;
let defaultString = variableFour ?? 'Default String';
console.log(defaultString); // Output: 'Default String'

let obj: { value?: string | null } = {};
let chainedValue = obj.value?.toUpperCase();
console.log(chainedValue); // Output: undefined

Advanced Usage Patterns

Advanced patterns, like using type predicates, can ensure more precise control over ‘null’ and ‘undefined’.

function isString(value: any): value is string {
    return typeof value === 'string' && value !== null;
}

if (isString(variableThree)) {
    console.log('variableThree is a confirmed string.');
}

Similarly, when dealing with array methods like ‘filter’, you can use type assertion to filter out ‘null’ or ‘undefined’ values.

let arrayOfValues: (string | null | undefined)[] = ['hello', null, 'world', undefined];
let filteredArray: string[] = arrayOfValues.filter((value): value is string => value !== null && value !== undefined);
console.log(filteredArray); // Output: ['hello', 'world']

Error Handling with Null and Undefined

The TypeScript compiler’s strict flag enforces strict null checking, making it easier to avoid ‘null’ and ‘undefined’ bugs in your code.

// TypeScript config with strict null checks enabled
{
    "compilerOptions": {
        "strict": true,
        "strictNullChecks": true
    }
}

This forces you to handle ‘null’ and ‘undefined’ deliberately in your code, reducing the incidence of null reference errors.

Conclusion

This comprehensive guide to ‘null’ and ‘undefined’ in TypeScript provides the foundation you need for safe type handling in your TypeScript applications. Embrace the discipline of type safety, leverage strict checks, and you’ll write clearer and more reliable TypeScript code.

Next Article: Equality Operators in TypeScript: A Complete Guide

Previous Article: Truthiness and Falsiness in TypeScript: A Complete Guide

Series: The First Steps to TypeScript

TypeScript

You May Also Like

  • TypeScript: setInterval() and clearInterval() methods (3 examples)
  • TypeScript sessionStorage: CRUD example
  • Using setTimeout() method with TypeScript (practical examples)
  • Working with window.navigator object in TypeScript
  • TypeScript: Scrolling to a specific location
  • How to resize the current window in TypeScript
  • TypeScript: Checking if an element is a descendant of another element
  • TypeScript: Get the first/last child node of an element
  • TypeScript window.getComputerStyle() method (with examples)
  • Using element.classList.toggle() method in TypeScript (with examples)
  • TypeScript element.classList.remove() method (with examples)
  • TypeScript: Adding Multiple Classes to An Element
  • element.insertAdjacentHTML() method in TypeScript
  • TypeScript – element.innerHTML and element.textContent
  • Using element.removeAttribute() method in TypeScript
  • Working with Document.createElement() in TypeScript
  • Using getElementById() method in TypeScript
  • Using Window prompt() method with TypeScript
  • TypeScript – window.performance.measure() method (with examples)