Avatar ·

Как настроить алиасы путей в tsconfig.json для TypeScript?

Привет! Я новичок в TypeScript и пытаюсь организовать структуру своего проекта. У меня есть вот такая простая структура папок: ``` src/ ├── components/ │ └── Header.ts ├── utils/ │ └── helpers.ts └── index.ts ``` В файле `index.ts` я импортирую компоненты и утилиты вот так: ```typescript import { Header } from './components/Header'; import { formatDate } from './utils/helpers'; ``` Всё работает, но когда проект разрастается, относительные пути становятся очень длинными и неудобными, например: `../../components/Header` или `../../../utils/helpers`. Это выглядит ужасно и сложно поддерживать. Я слышал, что в `tsconfig.json` можно настроить алиасы путей (path aliases), чтобы писать импорты как `@components/Header` или `@utils/helpers`. Я попробовал добавить в `tsconfig.json` такой блок: ```json { "compilerOptions": { "baseUrl": ".", "paths": { "@components/*": ["src/components/*"], "@utils/*": ["src/utils/*"] } } } ``` Но когда я пытаюсь написать `import { Header } from '@components/Header';`, TypeScript выдаёт ошибку: "Cannot find module '@components/Header'". Я использую Node.js и не понимаю, почему это не работает. Подскажите, пожалуйста, что я делаю не так? Нужно ли ещё что-то настраивать, кроме `tsconfig.json`? <<>>

Проблема: TypeScript не понимает алиасы путей без дополнительной настройки

Вы всё делаете правильно в tsconfig.json, но TypeScript только проверяет типы и компилирует код — он не умеет автоматически преобразовывать алиасы в реальные пути для Node.js или сборщика (например, Webpack, Vite, ts-node). Ошибка "Cannot find module" возникает именно на этапе выполнения, потому что Node.js не знает, что @components/Header — это ./src/components/Header.

Вот полное решение для разных сценариев.

1. Если вы используете Node.js (чистый TypeScript с tsc)

Добавьте в tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@components/*": ["src/components/*"],
      "@utils/*": ["src/utils/*"]
    },
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"]
}

Но этого недостаточно. Вам нужно установить пакет tsconfig-paths и использовать его при запуске:

npm install --save-dev tsconfig-paths

Затем запускайте ваш код через:

node -r tsconfig-paths/register dist/index.js

Или, если используете ts-node для разработки:

ts-node -r tsconfig-paths/register src/index.ts

2. Если вы используете Webpack (React, Angular и т.д.)

Добавьте алиасы в конфигурацию Webpack:

// webpack.config.js
const path = require('path');

module.exports = {
  resolve: {
    alias: {
      '@components': path.resolve(__dirname, 'src/components/'),
      '@utils': path.resolve(__dirname, 'src/utils/')
    }
  }
};

Теперь Webpack будет понимать алиасы при сборке.

3. Если вы используете Vite (современный стандарт)

Добавьте в vite.config.ts:

import { defineConfig } from 'vite';
import path from 'path';

export default defineConfig({
  resolve: {
    alias: {
      '@components': path.resolve(__dirname, 'src/components'),
      '@utils': path.resolve(__dirname, 'src/utils')
    }
  }
});

4. Если вы используете Next.js

В tsconfig.json уже есть встроенная поддержка алиасов. Просто укажите:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

Next.js автоматически подхватит эти настройки.

5. Для NestJS (аналогично Node.js)

Установите tsconfig-paths и добавьте в nest-cli.json:

{
  "compilerOptions": {
    "tsConfigPath": "tsconfig.build.json"
  }
}

И запускайте через nest start — NestJS сам подхватит tsconfig-paths.

Важные советы:

  • Всегда используйте baseUrl — он задаёт корень для всех относительных алиасов. Обычно ставят "." (корень проекта).
  • Проверьте, что пути в paths совпадают с реальной структурой папок. Ошибка в одной букве — и алиас не сработает.
  • Для VS Code TypeScript сам подхватит алиасы из tsconfig.json, поэтому автодополнение будет работать. Если нет — перезагрузите окно (Ctrl+Shift+P → "Developer: Reload Window").
  • Не путайте алиасы с baseUrl: baseUrl задаёт корень для всех путей, а paths — конкретные маппинги.

После настройки вы сможете писать красивые импорты:

import { Header } from '@components/Header';
import { formatDate } from '@utils/helpers';

Надеюсь, это поможет! Если остались вопросы — пишите.

<<>>

Альтернативный подход: Использование moduleResolution: "bundler" (TypeScript 5+)

Если вы используете TypeScript версии 5.0 или выше, можно упростить настройку, применив новый режим разрешения модулей — "bundler". Он специально создан для проектов, которые собираются с помощью bundler'ов (Webpack, Vite, esbuild) и не требуют дополнительных пакетов вроде tsconfig-paths.

Вот как это выглядит в tsconfig.json:

{
  "compilerOptions": {
    "moduleResolution": "bundler",
    "baseUrl": ".",
    "paths": {
      "@components/*": ["src/components/*"],
      "@utils/*": ["src/utils/*"]
    }
  }
}

Что это даёт?

  • TypeScript будет обрабатывать алиасы так же, как современные сборщики — без лишних шагов.
  • Не нужно устанавливать tsconfig-paths для Node.js, если вы используете tsx (альтернатива ts-node) или tsup.
  • Упрощается конфигурация: moduleResolution: "bundler" автоматически включает поддержку алиасов и других современных фич.

Важно: Этот режим подходит только если вы используете сборщик (Webpack, Vite, esbuild) или инструменты вроде tsx. Для чистого tsc с Node.js он может не сработать без дополнительных настроек. В таком случае лучше вернуться к первому ответу с tsconfig-paths.