Free Ebook cover Introduction to TypeScript: Static Typing for JavaScript

Introduction to TypeScript: Static Typing for JavaScript

New course

105 pages

Modules and Namespaces

Capítulo 24

Estimated reading time: 7 minutes

+ Exercise
Audio Icon

Listen in audio

0:00 / 0:00

In TypeScript, modules and namespaces are two concepts that help organize code, manage dependencies, and avoid naming conflicts. While they may seem similar at first glance, they serve different purposes and are used in different contexts. Understanding how to leverage these features can significantly enhance the maintainability and scalability of your TypeScript projects.

Modules

Modules are a way to encapsulate code and declare dependencies in TypeScript. They allow you to split your code into separate files, each representing a module, and control what is exposed to other parts of your application. TypeScript modules are based on the ES6 module system and are compatible with JavaScript's native module syntax.

Creating and Exporting Modules

To create a module, you simply write your TypeScript code in a separate file. You can then export any function, class, interface, or variable that you want to make available to other modules. There are two types of exports in TypeScript:

  • Named Exports: You can export multiple entities from a module using the export keyword. This allows other modules to import specific items using their names.
  • Default Exports: A module can have a single default export, which is the main entity that the module exports. Other modules can import this default export without specifying its name.

Here is an example of a module with named exports:

export function add(a: number, b: number): number {
  return a + b;
}

export function subtract(a: number, b: number): number {
  return a - b;
}

And here is an example with a default export:

Continue in our app.

You can listen to the audiobook with the screen off, receive a free certificate for this course, and also have access to 5,000 other free online courses.

Or continue reading below...
Download App

Download the app

export default function multiply(a: number, b: number): number {
  return a * b;
}

Importing Modules

To use the exported entities from a module, you need to import them into another module. You can use the import statement to bring in named exports or the default export:

Importing named exports:

import { add, subtract } from './math';
console.log(add(5, 3)); // Output: 8
console.log(subtract(5, 3)); // Output: 2

Importing a default export:

import multiply from './multiply';
console.log(multiply(5, 3)); // Output: 15

Modules in TypeScript are highly beneficial for developing large-scale applications as they provide a clear structure and dependency management system. They also enable code reusability, as you can import and use modules across different parts of your application.

Namespaces

Namespaces in TypeScript are a way to organize code within a single file or across multiple files. They are particularly useful when you want to group related functionalities or avoid naming conflicts in your codebase. Unlike modules, namespaces are purely a TypeScript construct and do not have a direct equivalent in JavaScript.

Declaring Namespaces

To declare a namespace, you use the namespace keyword followed by the namespace name. You can then define classes, interfaces, functions, and variables within the namespace. Here's an example:

namespace Geometry {
  export interface Shape {
    area(): number;
  }

  export class Circle implements Shape {
    constructor(public radius: number) {}
    area(): number {
      return Math.PI * this.radius * this.radius;
    }
  }

  export class Square implements Shape {
    constructor(public side: number) {}
    area(): number {
      return this.side * this.side;
    }
  }
}

Using Namespaces

To use the entities defined within a namespace, you must reference them using the namespace name as a prefix. This helps avoid naming collisions, especially in large projects:

const circle = new Geometry.Circle(5);
console.log(circle.area()); // Output: 78.53981633974483

const square = new Geometry.Square(4);
console.log(square.area()); // Output: 16

Namespaces can be split across multiple files, allowing you to organize your code better. To achieve this, you need to use the /// <reference path="..." /> directive to reference the files:

// file: geometry.ts
namespace Geometry {
  export interface Shape {
    area(): number;
  }
}

// file: circle.ts
/// <reference path="geometry.ts" />
namespace Geometry {
  export class Circle implements Shape {
    constructor(public radius: number) {}
    area(): number {
      return Math.PI * this.radius * this.radius;
    }
  }
}

// file: square.ts
/// <reference path="geometry.ts" />
namespace Geometry {
  export class Square implements Shape {
    constructor(public side: number) {}
    area(): number {
      return this.side * this.side;
    }
  }
}

Modules vs. Namespaces

While both modules and namespaces help organize code, they serve different purposes and are used in different scenarios:

  • Modules: Use modules when you want to encapsulate code in separate files, manage dependencies, and take advantage of the ES6 module system. Modules are ideal for large-scale applications and libraries.
  • Namespaces: Use namespaces when you want to organize code within a single file or across multiple files without creating separate modules. Namespaces are helpful for grouping related functionalities and avoiding naming conflicts in smaller projects.

In modern TypeScript development, modules are generally preferred over namespaces, as they align with the ES6 module system and are more suitable for large-scale applications. However, namespaces still have their place, especially in legacy codebases or when organizing code within a single file.

Conclusion

Modules and namespaces are powerful features in TypeScript that help you organize and manage your code effectively. By understanding the differences between them and when to use each, you can write cleaner, more maintainable, and scalable TypeScript applications. Whether you are building a small library or a large-scale application, leveraging modules and namespaces will undoubtedly enhance your development experience and the quality of your codebase.

Now answer the exercise about the content:

What is the main purpose of using modules in TypeScript?

You are right! Congratulations, now go to the next page

You missed! Try again.

The main purpose of using modules in TypeScript is to encapsulate code in separate files, manage dependencies, and take advantage of the ES6 module system. Modules allow developers to split their code into separate files, enhancing maintainability and scalability, while also enabling reuse and dependency management across different parts of an application.

Next chapter

Modules and Namespaces: Understanding the Module System

Arrow Right Icon
Download the app to earn free Certification and listen to the courses in the background, even with the screen off.