Основы Typescript

Теория: Система модулей

В этом уроке мы рассмотрим систему 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. Это гарантирует отсутствие коллизий имен и упрощает пользователям слияние интерфейсов. О последнем пункте поговорим в одном из следующих уроков курса.

Рекомендуемые программы