1
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?

More than 3 years have passed since last update.

typescriptのclassで継承元のメソッドを呼ぼうとしたら怒られた時 (typescript error 2340)

Posted at

概要

以下のコードは何が駄目か分かるでしょうか?

export class Hoge {
  public getA = () => 1;
}

export class Huga extends Hoge {
  public getA = () => {
    
    /*
    * error! 
    * 
    * 'super' キーワードを使用してアクセスできるのは、
    * 基底クラスのパブリック メソッドと保護されたメソッドのみです。ts(2340)
    */
    return super.getA();
  };
}

解決

エラー文だけ見ると「publicなのになんで?」という感じなのですが、ここで大事なのはそこではなく、「本来methodにするべき箇所でpropertyを使ってしまっている」という場所が問題です。

すなわち、以下にすると解決します。

export class Hoge {
  public getA() {
    return 1;
  }
}

export class Huga extends Hoge {
  public getA() {
    return super.getA();
  }
}

typescriptやjavascriptで書いていると、特にarrow functionのせいで変数でも関数でも差が無いように思い込みがちですが、classにおいてのpropertyとmethodは全く別物です。

細かい差異はいくつか他にもあるのですが、上記のように継承元の「method」を呼ぶことはできても「property」を呼ぶことはできないので注意しましょう。

1
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
1
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?