sawata0324
@sawata0324 (Sawata)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

TypeScriptで Cannot use JSX unless the '--jsx' flag is provided.エラーを解消したい

Q&A

Closed

解決したいこと

Next/Reactで作成したファイルをTypeScript化している序盤で

Cannot use JSX unless the '--jsx' flag is provided.

というエラーが出てしまいます。
どうやらTypeScriptがJSXを正しく認識するための設定が不足しているようなのですが、tsconfig.jsonの記述のどこに誤りがあるのかわかりません。
何かヒント、もしくは解決策をご教授いただけないでしょうか。

githubリンク

コマンドとエラー全文.
npx tsc '/Users/salt/Desktop/TsunaRhythm2/front/my-app/app/dashboard/components/RandomWord.tsx'
dashboard/components/RandomWord.tsx:33:5 - error TS17004: Cannot use JSX unless the '--jsx' flag is provided.

33     <div className="p-5 w-[5cm] h-52 bg-white shadow-custom-dark rounded-3xl flex items-center justify-center text-center">
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dashboard/components/RandomWord.tsx:34:7 - error TS17004: Cannot use JSX unless the '--jsx' flag is provided.

34       <p className="font-bold">{word}</p>
         ~~~~~~~~~~~~~~~~~~~~~~~~~

../node_modules/mime/dist/src/Mime.d.ts:5:5 - error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher.

5     #private;
      ~~~~~~~~


Found 3 errors in 2 files.

Errors  Files
     2  dashboard/components/RandomWord.tsx:33
     1  ../node_modules/mime/dist/src/Mime.d.ts:5
tsconfig.json
{
  "compilerOptions": {
    "target": "es2016",
    "jsx": "preserve",
    "module": "commonjs",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "noEmit": true,
    "incremental": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "baseUrl": ".", // 追加
    "paths": {      // 追加
      "@/*": ["./*"]
    }
  },
  "include": [
    "next-env.d.ts",
    ".next/types/**/*.ts",
    "**/*.ts",
    "**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}
RandomWord.tsx(実際にコンパイルしているファイル)
import * as React from "react";

const RandomWord: React.FC = () => {
  // 静的なランダムメッセージの配列
  const randomWords: string[] = [
    "自分を信じて、一歩一歩進んでいこう。",
    "小さな進歩も大きな成果につながる。",
    "休むことも大切。リフレッシュしてまた頑張ろう。",
    "努力は必ず報われる。諦めないで。",
    "夢に向かって進むあなたを応援しているよ。",
    "自分のペースで進んで大丈夫。",
    "失敗は成長のチャンス。前向きに捉えよう。",
    "焦らず、ゆっくり進んでいこう。",
    "自分を大切にしながら頑張ろう。",
    "いつも頑張っている自分を褒めてあげよう。",
    "周りのサポートを受け入れることも大事。",
    "自分の夢を信じて、前に進もう。",
    "休むことは怠けることじゃないよ。",
    "小さな成功も大切に喜ぼう。",
    "あなたの努力は必ず実を結ぶ。",
    "自分の力を信じて、前進しよう。",
    "焦らずに、マイペースで進んでいこう。",
    "他人と比べず、自分のペースを大事にしよう。",
    "心配事があれば、誰かに話してみよう。",
    "リフレッシュして、新しい気持ちで頑張ろう。",
  ];

  // ランダムなインデックスを生成
  const randomIndex: number = Math.floor(Math.random() * randomWords.length);
  const word: string = randomWords[randomIndex];

  return (
    <div className="p-5 w-[5cm] h-52 bg-white shadow-custom-dark rounded-3xl flex items-center justify-center text-center">
      <p className="font-bold">{word}</p>
    </div>
  );
};

export default RandomWord;

自分で試したこと

①エラー文である「Cannot use JSX unless the '--jsx' flag is provided.」をベタ貼りして出てきた「TSでReactの環境構築中に出た "error Cannot use JSX unless the '--jsx' flag is provided." を解消する」という記事を参照して下記のように記述を変えて試してみましたが変化ありませんでした。
https://qiita.com/hrism/items/3dff3f7822bb36e414a8

tsconfig.json(before)
~
    "target": "es2016",
    "jsx": "preserve",
~
tsconfig.json(after)
~
    "target": "ES6",
    "jsx": "react-jsx",
~

②他にも

を参考に

"jsx": "react",

としてみても変化ありません。
③現状の設定である

"jsx": "preserve",

も下記を参考にした結果ですが、これもダメでした。

④さらに下記の記事も参考にして

command + shift + p

から

typescript select

と検索してTypeScriptのバージョン選択→VSコードのバージョンを使用5.3.2としてみましたがこちらでも変化ありませんでした。

改めて何かヒントか解決策をご教授いただきたく存じます。
よろしくお願い申し上げます。🙇‍♂️

0

2Answer

リポジトリをクローンして front/my-appnpm run buildnpm run dev を実行しましたがエラーは出ませんでした。

そもそも、 Next を用いたプロジェクトでは通常 npx tsc '略/RandomWord.tsx' のように直接 tsc が実行されることはないはずです。このエラーが出たのはどのような状況ですか?(このコマンドを直接実行したのか、何か別のコマンドや操作の結果としてこれが表示されたのかなど)

ちなみに、 npx tsc '略/RandomWord.tsx' のようにパスを指定して実行すると tsconfig.json は無視されるので、エラーが出るのは正しい挙動です。

2Like

Comments

  1. @sawata0324

    Questioner

    ご確認、返信ありがとうございます!
    エラーが出たのはnpx tsc '略/RandomWord.tsx'コマンドを直接実行したときです。

    「ちなみに、 npx tsc '略/RandomWord.tsx' のようにパスを指定して実行すると tsconfig.json は無視されるので、エラーが出るのは正しい挙動です。」とありますが、この点が盲点だったかもしれません。
    docker-compose を使ってbuildやupを行っているので、npx tscコマンドは不要ということでしょうか。docker-compoise で立ち上げたフロントエンド環境は問題なく動作しているので、現在の'略/RandomWord.tsx'の記述は正しく動作しているということになり「次のファイルのTypeScript化に進んで良い」ということになるのでしょうか。

    この際、tsc 略/RandomWord.tsx --jsx reactコマンドで自動生成した '略/RandomWord.js'をコメントアウトするとフロントでは

    Unhandled Runtime Error
    Error: Unsupported Server Component type: {...}
    
    Call Stack
    

    というエラーがブラウザ上で確認できるため、.tsx拡張子の方のRandomWord.tsxコンポーネントは正常に読み込まれていないという認識をしておりました。

  2. Next は TypeScript に対応しているので、 npm run buildnpm run dev を実行すれば自動的にトランスパイルされます。 npx tsc は不要です。

    docker-compose up した時には frontend サービスのコマンドとして yarn dev が走ります。これは一応 npm run dev と同じ動作をします。(yarn ではなく npm のプロジェクトなので本来は npm run dev すべきですが。)

    次のファイルの TypeScript 化には進んで構いません。何か特別なコマンドを実行する必要はなく、ファイル単位で拡張子を .js(x) から .ts(x) に変えて型をつけるだけです。

    Error: Unsupported Server Component type: {...} は多分 TypeScript 化とは関係ないエラーです。

  3. @sawata0324

    Questioner

    丁寧なご回答ありがとうございます。これにて質問はクローズさせていただきます。
    大変助かりました!🙇‍♂️🙇‍♂️🙇‍♂️

GitHubのフロント(front)部分のコンポーネントディレクトリの中身を少し拝見しました。
各ファイルの拡張子が.js.jsxのものが散見されましたので、それが原因かもしれません。
TypeScriptでは.tsxという拡張子になります。

解決の糸口になりますと幸いです。

1Like

Your answer might help someone💌