Как настроить алиасы путей в tsconfig.json для TypeScript?
Проблема: 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.
Ответов пока нет.
Войдите чтобы оставить ответ