2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Google Closure Compiler でエラーが出たときの対処法:This language feature is only supported for UNSTABLE mode

Last updated at Posted at 2023-12-31

2024年1月1日からエラーにハマりました。

このエラーにハマるケースは多くないと思いますが、気が付いてしまったのでメモしておきます。そもそも、JavaScriptでクラス宣言する人なんて、いないと思いますけどね。

エラーになったソースコード

ブックマークレットにする前提のコードです。クラスを宣言し、クラスをnewしただけ。
Chrome Devtoolのコンソールに突っ込んだら動きますが、Closure Compilerではエラーになります。

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level SIMPLE_OPTIMIZATIONS
// @language_out ECMASCRIPT_2019
// ==/ClosureCompiler==

javascript:(()=>{
  class A{
    b; //public field 宣言
    constructor(a) {
      this.a = a;  
    }
  }
  const a = new A(1);
  console.log(a.a);  // 1
  console.log(a.b);  // undefined
})()

エラーメッセージ

Closure Compilerで出てきたエラーメッセージはこれです。

JSC_LANGUAGE_FEATURE: This language feature is only supported for UNSTABLE mode or better: Public class fields. at line 3 character 4
  b;
  ^`

Google で検索したけどドンピシャな回答は出てきませんでした。エラーメッセージを読む限り、パブリックなクラスフィールドに問題があるようだけど、どう直したらいいのかは分からないですね

エラーにならないコード

クラスのpublicなフィールドを表に出すなってことですね。Javaっぽくクラスのフィールドを書いてはいけないらしい。
コンストラクタの中でthis付けて強引に代入してしまえばよい。コンストラクタから引数を受け取る必要もないらしい。

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level SIMPLE_OPTIMIZATIONS
// @language_out ECMASCRIPT_2019
// ==/ClosureCompiler==


javascript:(()=>{
  class A{
    constructor(a) {
      this.a = a;
      
      //public フィールドはコンストラクタでthis.bと宣言する
      this.b = "bb";
    }
  }
  const a = new A(1);
  console.log(a.a); // a
  console.log(a.b); // bb
})()

JavaScript的に正しくてもClosureCompilerではだめでしたというお話でした。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?