- TypeScript Tutorial
- TypeScript Home
- TypeScript Introduction
- TypeScript Setup
- TypeScript First Program
- TypeScript vs JavaScript
- TypeScript Data Types
- TypeScript Type Inference
- TypeScript Type Annotations
- TypeScript Interfaces
- TypeScript Enums
- TypeScript Type Aliases
- TypeScript Type Assertions
- TypeScript Variables
- TypeScript Functions
- TypeScript Functions
- TypeScript Optional Parameters
- TypeScript Default Parameters
- TypeScript Rest Parameters
- TypeScript Arrow Functions
- Classes and Objects
- Introduction to Classes
- Properties and Methods
- Access Modifiers
- Static Members
- Inheritance
- Abstract Classes
- Interfaces vs Classes
- Advanced Types
- TypeScript Union Types
- TypeScript Intersection Types
- TypeScript Literal Types
- TypeScript Nullable Types
- TypeScript Type Guards
- TypeScript Discriminated Unions
- TypeScript Index Signatures
- TypeScript Generics
- Introduction to Generics
- TypeScript Generic Functions
- TypeScript Generic Classes
- TypeScript Generic Constraints
- TypeScript Modules
- Introduction to Modules
- TypeScript Import and Export
- TypeScript Default Exports
- TypeScript Namespace
- Decorators
- Introduction to Decorators
- TypeScript Class Decorators
- TypeScript Method Decorators
- TypeScript Property Decorators
- TypeScript Parameter Decorators
- Configuration
- TypeScript tsconfig.json File
- TypeScript Compiler Options
- TypeScript Strict Mode
- TypeScript Watch Mode
TypeScript Type Aliases
Type aliases in TypeScript are one of the most powerful features for keeping your codebase clean. Essentially, a type alias allows you to create a "nickname" for any type definition. Instead of repeating complex object structures or long union types throughout your project, you define them once and reuse them everywhere. This not only makes your code more readable but also significantly easier to maintain as your project grows.
string, calling it a UserID tells other developers exactly what that string represents.
Why Use Type Aliases?
- Readability: Complex nested objects become much easier to scan.
- Reusability: Define a type once and use it across multiple files or components.
- Maintainability: Updating a type in one place automatically updates it everywhere it's used.
- Abstraction: It helps you focus on what the data is rather than just its technical primitive form.
Creating a Type Alias
To define a type alias, use the type keyword. This is followed by the name you want to give the type (usually in PascalCase) and an assignment to the type structure.
type Point = {
x: number;
y: number;
};
// Now we use 'Point' just like a built-in type
const point1: Point = { x: 10, y: 20 };
console.log(point1); // Output: { x: 10, y: 20 }
UserAccount instead of userAccount) to distinguish them from regular variables and functions.
Type Aliases for Primitives
While TypeScript has built-in primitives like string and number, you can create aliases for them to add semantic meaning to your code. This is particularly useful in large financial or data-heavy applications.
type ID = number | string;
type DocumentName = string;
const userId: ID = "usr_9982";
const fileName: DocumentName = "invoice.pdf";
console.log(userId, fileName); // Output: usr_9982 invoice.pdf
type Minutes = number creates a new type of data. In reality, it's still just a number. TypeScript won't stop you from passing a Seconds number into a function expecting Minutes.
Type Aliases for Functions
When you pass functions as arguments (callbacks), the syntax can get messy. Type aliases allow you to define the function's signature—its parameters and return type—separately.
type MathOperation = (a: number, b: number) => number;
const add: MathOperation = (a, b) => a + b;
const multiply: MathOperation = (a, b) => a * b;
console.log(add(5, 3)); // Output: 8
console.log(multiply(5, 3)); // Output: 15
Type Aliases for Union Types
Union types allow a variable to hold one of several specific values. Aliasing these is the most common use case for type in modern web development, especially for state management.
type NetworkStatus = "loading" | "success" | "error";
function handleResponse(status: NetworkStatus) {
if (status === "loading") {
console.log("Fetching data...");
}
}
handleResponse("success");
// handleResponse("offline"); // Error: Argument is not assignable to NetworkStatus
Type Aliases for Intersection Types
Intersection types let you combine multiple types into one. This is great for "composing" objects where you have a base set of properties and want to add specialized ones for specific scenarios.
type Person = {
name: string;
age: number;
};
type Employee = Person & {
readonly employeeId: number;
department: string;
};
const developer: Employee = {
name: "Alice",
age: 30,
employeeId: 501,
department: "Engineering"
};
Type Aliases with Optional and Readonly Properties
You can make your types more robust by using the readonly modifier and the optional ? operator. readonly prevents a property from being changed after it's created, while ? indicates a property isn't strictly required.
type UserProfile = {
readonly id: number; // Cannot be changed after creation
username: string;
bio?: string; // Optional property
};
const user1: UserProfile = { id: 101, username: "dev_pro" };
// user1.id = 102; // Error: Cannot assign to 'id' because it is a read-only property
readonly check only happens at compile-time. Once the code is converted to JavaScript, the property can technically still be changed, so don't rely on it for security—only for developer workflow.
Type Aliases for Arrays and Tuples
Type aliases can make array definitions more expressive, especially when dealing with Tuples (arrays with a fixed number of elements of specific types).
type ResponseLog = [number, string]; // A tuple representing [StatusCode, Message]
const success: ResponseLog = [200, "OK"];
const notFound: ResponseLog = [404, "Not Found"];
Type Aliases vs Interfaces
One of the most common questions is: "Should I use type or interface?" While they overlap significantly, type aliases are generally more flexible because they can represent primitives and unions, which interfaces cannot.
interface for object structures that might be extended by others. Use type for unions, complex logic, or when you need to quickly describe data shapes.
Summary
Type aliases are a cornerstone of clean TypeScript development. They allow you to define clear, reusable, and descriptive names for any data structure in your application. By mastering aliases for objects, unions, and functions, you'll find your code becomes much more self-documenting and less prone to "magic string" or "any" type errors. Start by aliasing your most used data models and see how much cleaner your function signatures become!