Zenn
✂️

TypeScript 5.8のerasableSyntaxOnlyフラグ。enumやnamespaceが消える日が来た

2025/01/28に公開
9

TypeScript 5.8で導入されるerasableSyntaxOnlyフラグを使うと、enumnamespace、クラスのパラメータプロパティ、moduleキーワードなどの構文をエラーとして検出できます。これらの構文はNode.jsでTypeScriptを実行する際に非互換な構文であり、本フラグの導入によりNode.jsとTypeScriptの互換性が高まります。

本記事では、erasableSyntaxOnlyフラグの挙動と、なぜこのフラグが導入されたのかを解説します。

erasableSyntaxOnlyフラグの挙動

erasableSyntaxOnly とは、「削除可能な構文のみ」という意味です。削除可能な構文とは、Node.jsでTypeScriptを実行される際に削除される構文のことです。後ほど詳しく解説します。

erasableSyntaxOnlyフラグは、tsconfig.jsonのcompilerOptions"erasableSyntaxOnly": trueを設定することで有効になります。

{
  "compilerOptions": {
    "erasableSyntaxOnly": true
  }
}

このフラグをONにした状態で、enumnamespace、クラスのパラメータプロパティなどの構文を使ってみます。

enum MyEnum {
  A,
  B,
  C,
}

namespace myNameSpace {
  export const foo = 1;
}

class MyClass {
  constructor(private myField: string) {
    this.myField = "foo"
  }
}

TypeScript Playgroundで動作を確認すると、各構文がエラーになっていることがわかります。

erasableSyntaxOnlyによるエラー

※ TypeScript Playgroundにて、TS ConfigタブからerasableSyntaxOnlyフラグをONにして動作確認

次のリンクから動作を確認できます。

https://www.typescriptlang.org/play/?erasableSyntaxOnly=true&ts=5.8.0-dev.20250126#code/KYOwrgtgBAsgngUXNA3gKClAggGg1AIT0wGE8BfNNEAQwmAGcAHGgY2CgjgDk7gBlFuyjpMwAB5MA9gCcALlFZSQDBQDMpUqAF4oARgDcaSmlYAbGgwaw4JC1ZH4lKuTLCs5sgBRMZASwA3GjkOLgAxP2AzABMALihVfxAAcwBKR0xMOQALPwYAOnDImJ0oACINKTL8SnIgA

なぜerasableSyntaxOnlyフラグが導入されたのか

前提: Node.jsでTypeScriptの型注釈を削除し、そのまま実行できるようになった

最近のNode.jsでは、TypeScriptのコードをそのまま実行できます。従来のようにts-nodeを使う必要はありません。Node.jsがTypeScriptの型注釈を削除し、JavaScriptのコードとして実行しているのです。

Node.js v22.7では --experimental-strip-types フラグを使う必要がありました。

最新のNode.js v23.6では、フラグすらなしにTypeScriptコードを実行できます。 たとえば次のようなTypeScriptのコードを記述し、
index.tsというファイル名で保存します。

const myName: string = "とんこつ";
console.log(myName);

index.tsをNode.jsで実行するには、次のようにnodeコマンドを使うだけです。

node index.ts

実行結果は次のとおりです。

Node.jsでTypeScriptを実行する

型注釈の削除だけでは実行できないTypeScriptの構文をエラーにする

しかし、enumnamespace、クラスのパラメータプロパティなどの構文は、単純な型注釈の削除ではない変換処理が必要になり、「削除不可能な構文」とみなされます[1]

erasableSyntaxOnly フラグが提案されたのは、こういったNode.jsの削除不可能な構文をエラーにし、Node.jsのTypeScript実行との互換性を高める目的がありました。

https://github.com/microsoft/TypeScript/issues/59601

erasableSyntaxOnly フラグでエラーとみなされる主な構文は次のとおりです。

  • enum
  • namespace
  • クラスのパラメータプロパティ
  • レガシーなmodule

レガシーなmoduleとは、TypeScript独自のmoduleキーワードを使ったコードのことです。以前のバージョンのTypeScriptで使用されていた構文です。

なお、DecoratorsもNode.jsでは削除不可能構文とみなされます[2]が、TypeScriptのerasableSyntaxOnlyフラグをONにしてもエラーになりません。

enumnamespaceなどの構文がエラーになって困るか?

これは私個人の意見ですが、クラスのパラメータプロパティを除くと直近のコードで使う機会はほとんどありません。

enumを使っているコードは現場では極稀に見かけますが、enumのような挙動を実現したければ、次のようにオブジェクトリテラルを定義して、その型を使うようにしています。

const MyEnum = {
  A: 0,
  B: 1,
  C: 2,
} as const;

type MyEnum = typeof MyEnum;

namespaceは、 モジュールと import * asを使うことで実現できます。

foo.ts

export const myName = "とんこつ";

main.ts

import * as myNameSpace from "./foo";
console.log(myNameSpace.myName); // "とんこつ"

クラスのパラメータプロパティは、次のように実現できます。

class MyClass {
  private myField: string;

  constructor() {
    this.myField = "foo";
  }
}

それぞれ、erasableSyntaxOnly フラグをONにしてもエラーになりません。

TypeScript 5.8でエラーが出ていない様子

※ TypeScript Playgroundにて、TS ConfigタブからerasableSyntaxOnlyフラグをONにして動作確認

https://www.typescriptlang.org/play/?erasableSyntaxOnly=true&ts=5.8.0-dev.20250127#code/PTAEFEDsFcFtDsGQx3KH+zAUAYwPaQM4BdQBZATyjlAF5QBvVUUAQQC5QAGAGjtACEWBGTvQDCLAEycAvqACGOUFlx4A3KlR5iABwCmRUjFiVQ67ZgBmusrBWoQoQPUMgS4ZAnQzxAiwwPAhwyAfhkD9DIHWGQFuGV0AxhkBihgwAG1k5EiEonDlaeg0AJwBLADdpPB1YYgAxNK0IgBMWfHTIAHNregUK6HQ8TBSACgBKGi56PAALNJwAOjzC4pLDACJTTEwJlXoJVEXUIA

唯一悩んでいるのがクラスのパラメータプロパティで、筆者はNestJSのコードを書く際に使っています。NestJSでは、クラスのパラメータプロパティを使った依存性の注入が一般的なので、対応方法を検討中です。

erasableSyntaxOnlyは歓迎すべき挙動

筆者的にはerasableSyntaxOnlyは嬉しい挙動です。とりわけenumについては、生成されるJavaScriptコードが好みでなかったり、オブジェクトで表現したほうが各値のループの表現がしやすかったりで、ESlintで禁止して使わないようにしていました。また、Node.jsで動作するTypeScriptとの互換性が高まったこともメリットです。TypeScript 5.8にアップデートしたら早速フラグをONにするつもりです。

TypeScript 5.8は2025年2月25日にリリース予定ですので、今の内から挙動を試しておきましょう。

https://github.com/microsoft/TypeScript/issues/61023

参考資料

https://github.com/microsoft/TypeScript/issues/59601

https://nodejs.org/api/typescript.html#typescript-features

https://www.totaltypescript.com/erasable-syntax-only

https://www.totaltypescript.com/typescript-is-coming-to-node-23

脚注
  1. Node.jsでは --experimental-transform-types フラグを使うと変換が可能です ↩︎

  2. https://nodejs.org/api/typescript.html#typescript-features ↩︎

GitHubで編集を提案
9
Ubie テックブログ

Discussion

ログインするとコメントできます