В этом уроке мы рассмотрим систему TypeScript-модулей, которая была создана до стандартизации ESM-модулей.
По умолчанию эта система совместима с Node.js-модулями — она использует идентичный алгоритм определения импортов и экспортов. С другой стороны, синтаксически эта система больше похожа на ESM, потому что мы используем ключевые слова import
и export
для импортирования в текущий модуль и экспорта из него, при этом остается валидным использование CommonJS-модулей. Посмотрим, как это работает на практике:
// @file helloWorld.ts
export default function helloWorld() {
console.log('Hello, world!')
}
// @file main.ts
import helloWorld from './helloWorld'
Как и в ESM-стандарте, Typescript также поддерживает именованный экспорт и импорт, а также импорт всего экспортированного через import * as smth from './somewhere'
.
Некоторые пакеты поставляют только типы. Для таких случаев есть специальный синтаксис, который позволяет отдельно импортировать и экспортировать типы:
// @file user.types.ts
export type User = { name: string }
// @file main.ts
import type { User } from './user.types'
Если модули решают проблему разнородных сущностей и коллизий с помощью разнесения кода по нескольким файлам, то механизм namespace
позволяет оставаться в рамках одного файла:
namespace Hello {
export function helloWorld() {
console.log('Hello, world!')
}
}
const helloWorld = Hello.helloWorld()
Больше всего этот механизм полезен авторам библиотек и оберток с типами. Они заключают все интерфейсы в один namespace
. Это гарантирует отсутствие коллизий имен и упрощает пользователям слияние интерфейсов. О последнем пункте поговорим в одном из следующих уроков курса.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.