TypeScript by Example

Advanced Type Aliases

Generic, recursive, and template literal type aliases for reusable type-level shapes.

Once aliases name simple shapes, the same type keyword can express reusable type-level patterns.

Generic aliases accept type parameters, so one alias can describe many related shapes.

type Nullable<T> = T | null;
 
type ApiResponse<T> = {
  data: T;
  receivedAt: Date;
};
 
type User = { id: string; name: string };
 
const currentUser: Nullable<User> = null;
const response: ApiResponse<User> = {
  data: { id: "user_123", name: "Ada" },
  receivedAt: new Date(),
};

Recursive aliases reference themselves. Template literal types build valid strings from smaller choices.

type TreeNode = {
  value: number;
  left?: TreeNode;
  right?: TreeNode;
};
 
type EventName = "click" | "focus" | "blur";
type HandlerName = `on${Capitalize<EventName>}`;
// "onClick" | "onFocus" | "onBlur"
 
type Route = "/users" | "/posts";
type ApiRoute = `/api${Route}`;

In production

Reach for advanced aliases when valid values follow a real pattern. They are excellent for route names, event handlers, and recursive data structures, but a plain object alias is still better when the shape is simple.

Enjoyed this? Get more software craft delivered to your inbox.