Skip to main content
๐Ÿ“œ WAYPOINT LESSON

Everyday Types

โญโญ intermediateโณ 14 min read๐Ÿ“ Lesson 86 of 143

Primitives, arrays, objects, optional and readonly members, type aliases vs interfaces, and literal types.

The vocabulary you will use daily.

Objects, optional, readonly

type User = {
  id: number;
  email: string;
  displayName?: string; // may be absent โ€” type is string | undefined
  readonly createdAt: Date; // cannot be reassigned
};

? changes the type AND the shape-check: callers may omit it. readonly blocks reassignment (not deep freezing).

Aliases and interfaces

type ID = string | number; // aliases: unions, primitives, generics
interface Repo {
  url: string;
} // interfaces: object shapes, extendable
interface Repo {
  stars: number;
} // declaration merging (feature or footgun)

Either works for objects; reach for type when you need unions, mapped types, or utilities; interface when a library expects to extend your shape. Consistency matters more than the choice.

Literal types

A literal type is one exact value โ€” combined with unions, it becomes an enum without the enum:

type Direction = "north" | "east" | "south" | "west";
type Size = "sm" | "md" | "lg";
function move(dir: Direction, by: Size) { ... }
move("up", "md"); // โœ— "up" is not assignable

Arrays and tuples: string[] is many strings; [string, number] is exactly two, typed per position โ€” useful for key/value pairs and fixed results.