Skip to main content

Null and Undefined in TypeScript

Key Differences​

  1. Null: Must be explicitly set to null.
  2. Undefined: Set automatically at runtime when a variable has not been assigned a value.
const Rohit = {
name: "Rohit",
age: null,
};

interface Person {
name: string;
age?: number;
}

const Shubham: Person = {
name: "Shubham",
};

// const age: number = Shubham.age; // Error: Type 'undefined' is not assignable to type 'number'.

Non-Null Assertion Operator​

Used when we are certain a value is not null or undefined, often in unit tests or special scenarios.

interface Grocery {
fruits?: { name: string; quantity: number }[];
}

const grocery: Grocery = {};
grocery.fruits!.push({ name: "Rohitt", quantity: 2 }); // Error: Cannot read properties of undefined.

Definite Assignment Assertion​

The Definite Assignment Assertion Operator tells TypeScript that a variable will be assigned a value at runtime, even if it’s not initialized during declaration.

let value!: number;
value = 42; // No error, TypeScript assumes this value will be assigned.

Optional Chaining and Nullish Coalescing​

Optional Chaining (?.)​

Used to safely access deeply nested properties without causing errors if any reference is null or undefined.

interface Customer {
lastPayment?: {
paymentMethod?: string;
};
}

const customer: Customer = {};
const method = customer.lastPayment?.paymentMethod; // undefined

Nullish Coalescing Operator (??)​

Provides a default value when the left-hand operand is null or undefined.

const paymentMethod = customer.lastPayment?.paymentMethod ?? "Credit Card";
console.log(paymentMethod); // "Credit Card"