Ошибка "Cannot use JSX unless the '--jsx' flag is provided" в TypeScript и React
Hello, World!
Причина ошибки и её решение
Ошибка "Cannot use JSX unless the '--jsx' flag is provided" возникает, когда TypeScript-компилятор (tsc) не знает, как обрабатывать JSX-синтаксис в файлах с расширением .tsx. По умолчанию TypeScript не поддерживает JSX — эту возможность нужно явно включить.
В проектах, созданных через create-react-app, конфигурация уже настроена, поэтому npm start работает. Но при ручном запуске tsc вы используете настройки из tsconfig.json, которые могут быть неполными или отсутствовать.
Пошаговое решение
- Откройте файл
tsconfig.jsonв корне вашего проекта. Если его нет — создайте. - Добавьте (или измените) опцию
"jsx"в секцииcompilerOptions:
{
"compilerOptions": {
"jsx": "react-jsx", // для React 17+ (автоматический импорт)
// или "jsx": "react" // для React 16 и ниже (нужен явный import React)
}
}
Объяснение значений jsx:
"react"— преобразует JSX в вызовыReact.createElement. Требует явного импорта React в каждом файле:import React from 'react'."react-jsx"— использует новый JSX-трансформер (React 17+). Не требует явного импорта React."preserve"— оставляет JSX как есть (для дальнейшей обработки Babel).
Полный пример корректного tsconfig.json
{
"compilerOptions": {
"target": "ES6",
"module": "ESNext",
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true
},
"include": ["src"]
}
Почему create-react-app работает без этой настройки?
Create-react-app использует Babel для компиляции JSX, а TypeScript — только для проверки типов. Поэтому npm start работает даже с неполным tsconfig.json. Но если вы хотите компилировать проект через tsc (например, для сборки), нужно настроить "jsx" явно.
Дополнительные советы:
- Убедитесь, что файлы с JSX имеют расширение
.tsx, а не.ts. - Если используете React 16 или ниже, добавьте
"jsx": "react"и не забывайте импортировать React. - Проверьте версию TypeScript:
npx tsc --version. Для"react-jsx"нужен TypeScript 4.1+.
После изменения tsconfig.json запустите tsc снова — ошибка должна исчезнуть.
Альтернативный подход: использование Babel вместо tsc
Если вы не хотите менять tsconfig.json или используете инструменты сборки (Webpack, Vite), можно делегировать обработку JSX Babel, а TypeScript оставить только для проверки типов.
Установите необходимые пакеты:
npm install --save-dev @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript
Создайте babel.config.json:
{
"presets": [
"@babel/preset-env",
["@babel/preset-react", { "runtime": "automatic" }],
"@babel/preset-typescript"
]
}
В tsconfig.json установите "jsx": "preserve" — TypeScript не будет трогать JSX, оставляя его Babel:
{
"compilerOptions": {
"jsx": "preserve"
}
}
Теперь компиляцию выполняет Babel, а TypeScript только проверяет типы (tsc --noEmit). Этот подход чаще используется в профессиональных проектах с Webpack или Vite.
Преимущества: больше гибкости, поддержка новых фич. Недостаток: дополнительная зависимость от Babel.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги