TS Special Types

TypeScript provides special types that handle more nuanced cases like uncertain values, uninhabited states, or unknown inputs. This section covers any, unknown, never, null, and undefined.

Key Topics

Any vs Unknown

The any type disables type checking, effectively opting out of the TypeScript system. The unknown type is safer; you must narrow the type before you can use it.

let dataAny: any = "hello";
// No type errors, but less safety
dataAny = 42;

let dataUnknown: unknown = "world";
// Must check or assert the type before usage
if (typeof dataUnknown === "string") {
    console.log(dataUnknown.toUpperCase());
} else {
    console.log("Not a string");
}

Output

WORLD

Explanation: Using any bypasses type safety. With unknown, you must ensure the type is narrowed or type-asserted before using it in a way that requires a specific type.

Never Type

The never type indicates a value that never occurs, such as a function that never returns. It’s useful for unreachable code or functions that throw errors.

function throwError(message: string): never {
    throw new Error(message);
}

// This function never returns, so its return type is never.

Null & Undefined

In strict mode, null and undefined are distinct types that must be explicitly handled if a variable might have those values.

let optionalValue: string | null = null;

if (optionalValue !== null) {
    console.log(optionalValue.toLowerCase());
} else {
    console.log("Value is null");
}

Output

Value is null

Explanation: By including null in the type definition (string | null), TypeScript enforces checks for the null case before using the string value.

Key Takeaways

  • any: Opt-out of type checking; use sparingly.
  • unknown: Safer alternative to any; requires type checks before usage.
  • never: Functions or expressions that never produce a value.
  • null & undefined: Must be explicitly handled in strict mode.