Skip to content

Namespaces in TypeScript

Namespaces (previously called “internal modules”) organize related code into a single scope, preventing naming collisions. They’re primarily used for internal module organization in non-ES-module codebases.

namespace Validation {
export interface StringValidator {
isValid(s: string): boolean;
}
export class EmailValidator implements StringValidator {
isValid(s: string): boolean {
return s.includes("@");
}
}
}
// Usage
const emailValidator = new Validation.EmailValidator();
namespace App {
export namespace Models {
export interface User { id: number; name: string }
}
export namespace Utils {
export function formatDate(date: Date): string { return date.toISOString(); }
}
}
FeatureNamespacesES Modules
ScopeSingle file/globalFile-based
Tree-shakingLimitedExcellent
Modern codebasesLegacyPreferred
Bundler supportLimitedFull

Easy: What is a namespace in TypeScript?

Medium: How do you export members from a namespace?

Hard: When should you use namespaces instead of ES modules?