takashiskiのブログ

覚書の殴り書き

JavaScript: ES5クラスのメンバの型をany推論させない

訳あってES6クラスもTypeScriptも使えない人向けです。

コンストラクタで宣言したメンバは代入値がプリミティブでもanyとして推論されてしまいます。

function ES5Class() {
  this.property = 'value';
}

これはts-serverには単なる関数として解釈されるため、this自体がanyとして推論されているからであると推測をしていますが、明示的にメンバに対してtypeアノテーションをすることで型を指定することができます。謎ですね。

プリミティブ含めてすべてのメンバに型を書くのは面倒なので、 対処として、thisを別名に代入し、別名に対して特定のクラスのインスタンスであることを示すことで型推論させることができます。

function ES5Class() {
    /** @type {ES5Class} */
    const self = this
    self.property = 'value'
}

ES5Class.prototype.method = function () {
    return this.property;
}