Open7

TypeScript 4.7 変更点 (WIP)

おーみーおーみー

ECMAScript Module Support in Node.js

ついに来たという感じ。TS 4.5で入りそうになったけどもうちょっと揉むわ的な感じになりnightlyでのみ利用できたあの機能がついにやってくる。

新しい module 設定の node12 nodenext を付けると有効化される。

{
    "compilerOptions": {
        "module": "nodenext",
    }
}
おーみーおーみー

type in package.json and New Extensions

package.jsonで type"module" "commonjs" のどちらかをとり、Node.jsが .js ファイルをどちらのモジュールで解釈するかを決定づける。TSもこれに乗っかり、.ts .tsx ファイルがどちらであるかを type を読んで決定する。

なお、ESMではインポート時に拡張子が必須なため、TSファイルであっても import x from "x.js" というインポートが必要になる。

おーみーおーみー

Control over Module Detection

ECMAScriptにモジュールを追加するうえで問題だったのが既存のscriptと新しいmoduleをどう区別するかだった。Node.jsでは .mjs ファイルをESMと解釈し、またpackage.jsonの type を見て .js ファイルの扱いを決める。TypeScriptではimport export宣言のあるファイルはmodule、それ以外はscriptとして扱ってきたが、検出方法をNode.jsに合わせる。

そのため、コンパイラオプションに moduleDetection が追加される。デフォルト値の "auto"legacyforce の3つの値をとる。

auto では import/export を見ることはなく、

  • compilerOptions.modulenode12 nodenext で、package.jsonの typemodule のとき
  • compilerOptions.jsxreact-jsx で、JSX/TSXファイルのとき

[1] moduleとして解釈される。

legacy はTS 4.6以前の挙動に戻す。

force.d.ts 以外全部をモジュールとして扱う。

脚注
  1. andかorかよくわかってないがたぶんorだよな…? ↩︎