Typescript Module- en Namespace-Management
description
Met deze prompt leer je hoe je je Typescript-code effectief kunt organiseren met modules en namespaces. Dit helpt bij het voorkomen van naamconflicten, bevordert hergebruik van code en maakt je projecten schaalbaarder en beter beheersbaar dan wanneer je alles in één bestand schrijft.
prompt
Leg uit hoe ik modules en namespaces in Typescript kan gebruiken om mijn code te organiseren en herbruikbaar te maken voor <beschrijving van het project of de codebas ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
In TypeScript helpen modules en namespaces je om je code overzichtelijk, herbruikbaar en conflictvrij te houden. Hier is een overzicht van hoe je ze effectief kunt gebruiken:
**Modules:**
Modules in TypeScript worden gerealiseerd door bestanden te gebruiken waarin je functies, klassen, interfaces enzovoort exporteert en vervolgens importeert in andere bestanden. Dit bevordert hergebruik en scheiding van concerns.
*Voorbeeld:*
*In `shared.ts`:*
```typescript
export function logMessage(message: string): void {
console.log(`Shared log: ${message}`);
}
export class Utility {
static formatDate(date: Date): string {
return date.toISOString();
}
}
export interface User {
id: number;
name: string;
}
```
*In een ander bestand, bijvoorbeeld `app.ts`:*
```typescript
import { logMessage, Utility, User } from './shared';
const user: User = { id: 1, name: 'Jan' };
logMessage(`Gebruiker: ${user.name}`);
console.log(`Gecentraliseerde datum: ${Utility.formatDate(new Date())}`);
```
**Namespaces:**
Namespaces worden gebruikt om groepen van code binnen hetzelfde bestand of project te organiseren, vooral handig om naamconflicten te voorkomen zonder dat je meerdere bestanden hoeft te gebruiken. Ze worden vooral in oudere code of in globale scripts gebruikt.
*Voorbeeld:*
```typescript
namespace Auth {
export class UserManager {
login(username: string, password: string): boolean {
// login logica
return true;
}
}
export function logout(): void {
// logout logica
}
}
namespace Utils {
export function formatDate(date: Date): string {
return date.toLocaleDateString();
}
}
```
*Gebruik binnen dezelfde scope:*
```typescript
const authManager = new Auth.UserManager();
authManager.login('jan', 'wachtwoord');
console.log(Utils.formatDate(new Date()));
```
**Verschil en gebruik:**
- Gebruik modules (bestanden met `import`/`export`) voor grotere projecten en wanneer je code in meerdere bestanden wilt organiseren.
- Gebruik namespaces vooral om naamconflicten te voorkomen binnen dezelfde globale scope of in scripts zonder module-systemen.
**Samenvatting:**
- Exporteren functies, klassen, interfaces via `export`.
- Importeren via `import { ... } from '...'`.
- Gebruik namespaces met `namespace` en `export` binnen hetzelfde bestand om logische groepen te maken en naamconflicten te voorkomen.
Door deze technieken te combineren, kun je een schaalbare, overzichtelijke en herbruikbare webapplicatie opbouwen met gedeelde functionaliteiten en zonder naamconflicten.
provider: deepseek
model: deepseek-chat
Zeker! Hier is een uitgebreide uitleg over het gebruik van modules en namespaces in TypeScript voor webapplicaties:
## Modules in TypeScript
### Basis export/import
```typescript
// mathUtils.ts
export function add(a: number, b: number): number {
return a + b;
}
export const PI = 3.14159;
export interface Point {
x: number;
y: number;
}
```
```typescript
// main.ts
import { add, PI, Point } from './mathUtils';
const result = add(5, 3);
const point: Point = { x: 10, y: 20 };
```
### Default exports
```typescript
// Logger.ts
export default class Logger {
static log(message: string): void {
console.log(`[LOG]: ${message}`);
}
}
```
```typescript
// Gebruik van default export
import Logger from './Logger';
Logger.log('Hallo wereld!');
```
### Namespace imports
```typescript
// Gebruik van namespace import
import * as MathUtils from './mathUtils';
const result = MathUtils.add(10, 5);
```
## Namespaces voor naamconflicten voorkomen
### Basis namespace
```typescript
// shapes/Circle.ts
namespace Shapes {
export class Circle {
constructor(public radius: number) {}
area(): number {
return Math.PI * this.radius ** 2;
}
}
}
```
```typescript
// shapes/Square.ts
namespace Shapes {
export class Square {
constructor(public side: number) {}
area(): number {
return this.side ** 2;
}
}
}
```
### Gebruik van namespaces
```typescript
// main.ts
/// <reference path="shapes/Circle.ts" />
/// <reference path="shapes/Square.ts" />
const circle = new Shapes.Circle(5);
const square = new Shapes.Square(4);
console.log(circle.area()); // 78.54
console.log(square.area()); // 16
```
## Geavanceerde voorbeelden
### Geneste namespaces
```typescript
namespace Application {
export namespace Utils {
export class Validator {
static isEmail(email: string): boolean {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
}
export namespace Formatters {
export function formatCurrency(amount: number): string {
return `€${amount.toFixed(2)}`;
}
}
}
}
// Gebruik
const isValid = Application.Utils.Validator.isEmail('test@example.com');
const formatted = Application.Utils.Formatters.formatCurrency(99.99);
```
### Modules met namespaces combineren
```typescript
// api/UserService.ts
export namespace API {
export interface User {
id: number;
name: string;
email: string;
}
export class UserService {
static getUser(id: number): Promise<User> {
// API call implementatie
return Promise.resolve({ id, name: 'John Doe', email: 'john@example.com' });
}
}
}
```
```typescript
// Gebruik met import
import { API } from './api/UserService';
const userService = new API.UserService();
userService.getUser(1).then(user => {
console.log(user.name);
});
```
## Configuratie in tsconfig.json
```json
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "node",
"target": "ES2020",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
}
}
```
## Best practices
1. **Gebruik modules** voor moderne projecten (aanbevolen)
2. **Namespaces** zijn handig voor legacy code of wanneer je globale scope wilt vermijden
3. **Consistente naamgeving** voor imports
4. **Barrel files** voor het groeperen van exports:
```typescript
// index.ts (barrel file)
export * from './mathUtils';
export * from './stringUtils';
export * from './dateUtils';
```
```typescript
// Gebruik van barrel file
import { add, formatDate, capitalize } from './utils';
```
Deze aanpak zorgt voor:
- ✅ Herbruikbare code
- ✅ Voorkomen van naamconflicten
- ✅ Betere onderhoudbaarheid
- ✅ Duidelijke code-organisatie
- ✅ Eenvoudige testing
Kies modules voor nieuwe projecten en overweeg namespaces wanneer je werkt met bestaande codebases of specifieke organisatiebehoeften hebt.