Модули в TypeScript
Эта статья объясняет модули в TypeScript.
YouTube Video
Модули в TypeScript
Модули в TypeScript — это важная функция, улучшающая повторное использование и поддержку кода. Как и JavaScript, TypeScript основан на системе модулей ECMAScript 2015 (ES6), но его ключевой особенностью является возможность использования системы типов TypeScript.
Что такое модули?
Модуль — это система группировки связанного кода в единый блок, который можно импортировать и повторно использовать в других файлах. В TypeScript создается область видимости для каждого файла, чтобы инкапсулировать код и не позволять ему влиять на другие файлы. Это помогает избежать конфликтов кода и упрощает его поддержку.
Внутренние и внешние модули
- Внутренние модули (пространства имен): Способ определения модулей, использовавшийся в TypeScript 1.5 и ранее, сейчас не рекомендуется. Сейчас это рассматривается как «пространство имен».
- Внешние модули: Текущий стандарт, основанный на системе модулей ES6. Этот раздел в основном объясняет внешние модули.
Как экспортировать модули
При создании модулей экспортировать их обязательно для обеспечения доступа извне. В TypeScript можно экспортировать значения, функции, классы и т. д., используя ключевое слово export
. Существует два основных типа экспорта.
Именованный экспорт
Используется для создания нескольких экспортов, позволяя стороне импорта выбирать и использовать конкретные.
1// mathUtils.ts
2export const pi: number = 3.14159;
3
4export function add(x: number, y: number): number {
5 return x + y;
6}
7
8export function subtract(x: number, y: number): number {
9 return x - y;
10}
Экспорт по умолчанию
Используется, когда вы хотите, чтобы весь модуль имел один экспорт по умолчанию. Экспорт по умолчанию происходит без имени, позволяя стороне импорта принимать их под любым именем.
1// calculator.ts
2export default class Calculator {
3 add(x: number, y: number): number {
4 return x + y;
5 }
6
7 subtract(x: number, y: number): number {
8 return x - y;
9 }
10}
Как импортировать модули
Для использования модулей вы импортируете значения, функции, классы и т.д. из модуля с помощью ключевого слова import
.
Именованные импорты
При импорте конкретных элементов из именованного экспорта используйте фигурные скобки {}
.
1// main.ts
2import { pi, add, subtract } from './mathUtils';
3
4console.log(`Value of pi: ${pi}`);
5console.log(`Addition: ${add(10, 5)}`);
6console.log(`Subtraction: ${subtract(10, 5)}`);
Импорты по умолчанию
При импорте экспорта по умолчанию вы можете назначить ему любое имя.
1// main.ts
2import Calculator from './calculator';
3
4const calculator = new Calculator();
5console.log(`Addition: ${calculator.add(10, 5)}`);
6console.log(`Subtraction: ${calculator.subtract(10, 5)}`);
Псевдонимы для импорта
Чтобы избежать конфликтов имен или сократить длинные имена, вы можете использовать псевдонимы для импорта.
1// main.ts
2import { add as addition, subtract as subtraction } from './mathUtils';
3
4console.log(`Addition: ${addition(10, 5)}`);
5console.log(`Subtraction: ${subtraction(10, 5)}`);
Разница между модулями и пространствами имен
Пространство имен (namespace
) — это внутренняя структура модуля, использовавшаяся на ранних этапах TypeScript для группировки кода. Однако сейчас рекомендуется использовать модули ES6, и пространства имен практически не нужны.
Пространства имен могут быть определены в пределах одного файла или между несколькими, и из-за их глобального расширения управление зависимостями может стать затруднительным. В отличие от этого, модули имеют отдельные области видимости для каждого файла и имеют четко определённые зависимости, что делает их современным и безопасным способом работы.
1// Example of a namespace
2namespace Geometry {
3 export function calculateArea(radius: number): number {
4 return Math.PI * radius * radius;
5 }
6}
7
8// Can be used directly without importing the module (not recommended)
9const area: number = Geometry.calculateArea(5);
10console.log(`Area: ${area}`);
Разрешение модулей в TypeScript
В TypeScript существуют две стратегии разрешения модулей.
- Node Module Resolution: Стандартный метод разрешения, используемый в среде Node.js, который ищет модули в папке
node_modules
. - Classic Module Resolution: Собственный метод разрешения в TypeScript, обеспечивающий более гибкий поиск, но редко используемый в наше время.
Как правило, используется разрешение модулей Node, которое включено по умолчанию, если не указано иное в конфигурационном файле.
Практический пример
Наконец, представлен пример реализации и повторного использования вычислительных функций с использованием модулей.
mathUtils.ts
1export const pi: number = 3.14159;
2
3export function multiply(x: number, y: number): number {
4 return x * y;
5}
6
7export function divide(x: number, y: number): number {
8 if (y === 0) {
9 throw new Error("Cannot divide by zero");
10 }
11 return x / y;
12}
calculator.ts
1import { multiply, divide } from './mathUtils';
2
3export default class Calculator {
4 multiplyNumbers(x: number, y: number): number {
5 return multiply(x, y);
6 }
7
8 divideNumbers(x: number, y: number): number {
9 return divide(x, y);
10 }
11}
main.ts
1import Calculator from './calculator';
2
3const calculator = new Calculator();
4
5const result1: number = calculator.multiplyNumbers(10, 5);
6console.log(`Multiplication: ${result1}`);
7
8const result2: number = calculator.divideNumbers(10, 2);
9console.log(`Division: ${result2}`);
Резюме
Система модулей TypeScript — это мощный инструмент для организации кода, повышения его повторного использования и улучшения сопровождаемости. Рекомендуется использовать внешние модули на основе модулей ES6, а использование ключевых слов export
и import
позволяет легко экспортировать и импортировать модули.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.