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ではだめでしたというお話でした。