📦

TypeScript Compiler の isolatedModules オプションとは

2022/01/23に公開

TypeScript のコードを扱うにあたって、 TypeScript Compiler (TSC) 以外のトランスパイラに配慮するためのものである。

TSC 以外のトランスパイラは、往々にして一度にひとつのファイルのみ扱うので、完全な型システムの理解はない。
このため、const enumnamespace を正しく扱えない可能性がある。

isolatedModules オプションを有効にすると、シングルファイルでの変換で正しく扱えない可能性のあるコードについて、警告を出す。

フラグが有効のときに使えないコード

値のない型の export

TSC では、ある型が実態のない(型情報しかない)場合、javaScriptでは export の対象から省く。

example1.ts
import { someType, someFunction } from "someModule";

someFunction();

export { someType, someFunction };
example1.js
export { someFunction };

トランスパイラは型が値を生成するか判断できない。よって、型のみを export するとエラーとする。

モジュールじゃないコード

example2.ts
function fn() {}

すべてのコードをモジュールにすることが求められるので、何らかの import / export をするか、空の export を埋め込む必要がある。

const enum を使っているコード

example3.ts
declare const enum Numbers {
    Zero = 0,
    One = 1,
}
console.log(Numbers.Zero + Numbers.One);

これは、変換後に実際の値へ置き換えられる。

example3.js
"use strict";
console.log(0 + 1);

シングルファイルのトランスパイルでは、このように(特に他のァイルで定義されたconstなどの)参照を置き換えられない。
よって、エラーとさせる。

References

https://zenn.dev/yajamon/articles/df3b023178df80

  • TSC 以外のトランスパイラを使うので、 TSC 自体にはファイルを出力させないようにするとよい
GitHubで編集を提案

Discussion