Date 2022-12-03

ts-node: TS1208 エラー

※ この記事を書いてから1年以上経ってるかも

  tech ,  TypeScript

TypeScript で書いたバッチスクリプトを実行するために ts-node を利用したさいに TS1208 エラーと遭遇したときのメモ。

環境

  • SvelteKit プロジェクト内(Vite環境)
  • yarn
  • TypeScript 4.9
  • ts-node 10.9.1

エラー内容

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.jsonisolateModules: true を設定していたのが直接の原因だった。

  • isolateModules: true の場合、全ての実行ファイルはモジュールでなければならない
  • つまり、なんからの形で import / export できる必要がある
    • importexport もないファイルはコンパイルエラーになる

簡易なバッチスクリプトなど、特に import も export も必要ない場合、 エラーメッセージにも示されてるように、 空export文 export {} を追加することで回避できる。

参考: https://www.typescriptlang.org/tsconfig#non-module-files