※ この記事を書いてから1年以上経ってるかも
TypeScript で書いたバッチスクリプトを実行するために
ts-node
を利用したさいに TS1208 エラーと遭遇したときのメモ。
src/lib/task/sample.ts
console.log("Hello");
上記のように1行だけのテストスクリプトを用意し ts-node で実行したところ、 以下のエラーが発生した。
$ yarn ts-node src/lib/task/sample.ts
yarn run v1.22.18
$ /app/node_modules/.bin/ts-node src/lib/task/sample.ts
/app/node_modules/ts-node/src/index.ts:859
return new TSError(diagnosticText, diagnosticCodes, diagnostics);
^
TSError: ⨯ Unable to compile TypeScript:
src/lib/task/sample.ts:1:1 - error TS1208: 'sample.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.
1 console.log(`Hello TypeScript!`);
~~~~~~~
at createTSError (/app/node_modules/ts-node/src/index.ts:859:12)
at reportTSError (/app/node_modules/ts-node/src/index.ts:863:19)
at getOutput (/app/node_modules/ts-node/src/index.ts:1077:36)
at Object.compile (/app/node_modules/ts-node/src/index.ts:1433:41)
at transformSource (/app/node_modules/ts-node/src/esm.ts:400:37)
at /app/node_modules/ts-node/src/esm.ts:278:53
at async addShortCircuitFlag (/app/node_modules/ts-node/src/esm.ts:409:15)
at async ESMLoader.load (node:internal/modules/esm/loader:407:20)
at async ESMLoader.moduleProvider (node:internal/modules/esm/loader:326:11)
at async link (node:internal/modules/esm/module_job:70:21) {
diagnosticCodes: [ 1208 ]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
export {}; を追加し、
ファイルをモジュールとして有効な形にすることで解決できた。
src/lib/task/sample.ts
console.log("Hello");
export {};
tsconfig.json で isolateModules: true を設定していたのが直接の原因だった。
isolateModules: true の場合、全ての実行ファイルはモジュールでなければならないimport / export できる必要があるimport も export もないファイルはコンパイルエラーになる簡易なバッチスクリプトなど、特に import も export も必要ない場合、
エラーメッセージにも示されてるように、
空export文 export {} を追加することで回避できる。
参考: https://www.typescriptlang.org/tsconfig#non-module-files