4.1 Основные понятия
В TypeScript есть два способа организации и структурирования кода: модули и пространства имен. Оба подхода имеют свои особенности и применяются в различных сценариях. В чем же их отличия? Вот сейчас мы их и рассмотрим.
Модули
Модули в TypeScript основаны на стандарте ECMAScript Modules (ESM) и являются логическими единицами, разделяющими код на отдельные файлы. Модули изолируют контекст и предоставляют средства для экспорта и импорта значений между файлами.
Пример модуля:
// math.ts
export const PI = 3.14;
export function add(x: number, y: number): number {
return x + y;
}
// main.ts
import { PI, add } from './math';
console.log(PI); // 3.14
console.log(add(2, 3)); // 5
Пространства имен
Пространства имен (Namespaces) в TypeScript используются для логической группировки кода внутри одного файла или нескольких файлов. Они позволяют организовывать код и избегать конфликтов имен.
Пример пространства имен:
namespace MathUtils {
export const PI = 3.14;
export function add(x: number, y: number): number {
return x + y;
}
}
console.log(MathUtils.PI); // 3.14
console.log(MathUtils.add(2, 3)); // 5
4.2 Ключевые отличия
Изоляция и область видимости:
- Модули: каждый файл является изолированным модулем. Импортируемые и экспортируемые значения четко определены, что предотвращает конфликты имен и обеспечивает четкую область видимости.
- Пространства имен: пространства имен работают в глобальной области видимости, если не использовать директивы ссылок. Это может привести к потенциальным конфликтам имен в больших проектах.
Загрузка и сборка:
- Модули: модули поддерживают динамическую загрузку, что позволяет загружать код по мере необходимости, улучшая производительность. Модули также поддерживаются большинством современных сборщиков (Webpack, Rollup и т. д.).
- Пространства имен: пространства имен загружаются статически и не поддерживают динамическую загрузку. Они чаще используются в проектах без сложных сборщиков или в старых кодовых базах.
Стандарт и совместимость:
- Модули: модули соответствуют стандарту ECMAScript и совместимы с JavaScript-модулями. Это делает их предпочтительными для новых проектов и интеграции с современными библиотеками и фреймворками.
- Пространства имен: пространства имен специфичны для TypeScript и не поддерживаются напрямую в JavaScript. Они полезны в TypeScript-проектах, но их использование ограничено при интеграции с чистым JavaScript.
4.3 Использование и примеры
Пример использования модулей:
// shapes/circle.ts
export class Circle {
constructor(public radius: number) {}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
// shapes/square.ts
export class Square {
constructor(public sideLength: number) {}
area(): number {
return this.sideLength * this.sideLength;
}
}
// main.ts
import { Circle } from './shapes/circle';
import { Square } from './shapes/square';
const circle = new Circle(5);
console.log(circle.area()); // 78.54
const square = new Square(4);
console.log(square.area()); // 16
Пример использования пространств имен:
namespace Shapes {
export class Circle {
constructor(public radius: number) {}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
export class Square {
constructor(public sideLength: number) {}
area(): number {
return this.sideLength * this.sideLength;
}
}
}
const circle = new Shapes.Circle(5);
console.log(circle.area()); // 78.54
const square = new Shapes.Square(4);
console.log(square.area()); // 16
4.4 Лучшие практики
Когда использовать модули
- Новые проекты: модули являются современным стандартом, поддерживаемым большинством инструментов и библиотек. Они предпочтительны для новых проектов.
- Интеграция с JavaScript: если ваш проект взаимодействует с JavaScript-библиотеками или фреймворками, модули обеспечат лучшую совместимость.
- Динамическая загрузка: модули позволяют загружать код по мере необходимости, что улучшает производительность и сокращает время начальной загрузки.
Когда использовать пространства имен
- Миграция старого кода: пространства имен могут быть полезны при миграции старого кода на TypeScript, особенно если проект не использует современные сборщики.
- Простые проекты: в небольших или учебных проектах пространства имен могут быть удобны для организации кода без необходимости настройки сложных инструментов.
- Внутренняя логическая группировка: если необходимо организовать код в одном файле или логически сгруппировать несколько элементов, пространства имен могут быть полезны.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ