Namespaces in TypeScript are a way to group related functions, interfaces, types, or classes under a single name to organize code and avoid name conflicts.
πΈ Think of namespaces like modules, but bundled within a single file or compiled JS output (i.e., no file-system separation required).
β Basic Syntax
namespace Utilities {
export function greet(name: string): string {
return `Hello, ${name}`;
}
export const PI = 3.14;
}The
exportkeyword is required to make items accessible outside the namespace.
π§ͺ Usage
console.log(Utilities.greet("Codeveda")); // Hello, Codeveda
console.log(Utilities.PI); // 3.14π‘ Why Use Namespaces?
Benefit | Description |
|---|---|
π¨βπ©βπ§ Group related code | E.g., utility functions, constants |
π Avoid global scope pollution | Helps prevent name conflicts |
π Structure large applications | Useful when not using modules or bundlers |
π§© Nesting Namespaces
namespace App {
export namespace Models {
export interface User {
name: string;
age: number;
}
}
}
const user: App.Models.User = {
name: "Tisha",
age: 21
};π Splitting Namespaces Across Files
To spread a namespace across files, use the /// <reference path="" /> directive.
// utils.ts
namespace Utils {
export function sayHi() {
console.log("Hi");
}
}// main.ts
/// <reference path="utils.ts" />
Utils.sayHi(); // Hiβ οΈ Note: This pattern is mostly legacy. Modules (ES6/TypeScript) are preferred now in modern projects.
β Namespaces vs Modules
Feature | Namespace | Module (ESM / CommonJS) |
|---|---|---|
File system scoped | β Not required | β Yes (one file = one module) |
Runtime code | All in one compiled JS | Split per file |
Preferred today? | β Only for legacy/internal use | β Yes (default for modern projects) |
β When to Use Namespaces
Legacy TypeScript codebases
In browser-only apps without module bundlers
When needing to bundle all logic into one output JS file
π§ Pro Tip
If you're using modern tooling (Webpack, Vite, etc.), use modules instead of namespaces.