eoao
@eoao

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

クラスの外に宣言する変数について

解決したいこと

TypeScriptでクラス内で自由に使える定数を宣言したくやってみたところ
constはメソッドの中とクラスの外でしか使えず
メンバ変数として使う場合はreadonlyをつけるしかなさそうでした。

クラスの外で宣言されている変数はメンバ変数と同様の扱いになるのでしょうか?
(どういう名前で呼ばれる変数なのか、わかりませんでした)
加えて、定数は大文字で書くのが慣習としてあると聞いたのですが
constやreadonlyをつけても大文字にしていないソースが多いのはどうしてでしょうか。

初歩的な質問で申し訳ございません。ご回答よろしくお願いいたします。

import 

// クラスの外で宣言。定数のため大文字?
const HOGE = 0;

export class testClass {

  // メンバ変数として宣言。読み取り専用だが小文字
  readonly fuga = 1

  testMethod() {
    // メソッドの中で宣言。変更不可。小文字?
    const piyo = 3;
  }
}
0

2Answer

クラスの外で宣言されている変数はメンバ変数と同様の扱いになるのでしょうか?

同じ扱いではありません。
クラス外で宣言された変数(HOGE)はプログラム全体で一つのものを共有しています。
メンバ変数(fuga)はインスタンスごとに一つのものを共有します。
複数のインスタンスがあればその分だけfugaが存在しているイメージです。

定数は大文字で書くのが慣習としてあると聞いたのですが
constやreadonlyをつけても大文字にしていないソースが多いのはどうしてでしょうか。

間違っているかもしれませんが、グローバルでユニークな定数の時に大文字の変数名を付けるものと私は認識しています。
なので、インスタンス変数(fuga)であったりローカル変数(piyo)は小文字で、クラス外で宣言された変数(HOGE)は大文字にします。
またサンプルコードにはありませんが、testClassがpublicでreadonlyなクラス変数を持っていた場合はそれも大文字にします。

0Like

constはJavaScript及びTypeScriptでは変数の宣言子で、定数(というより読み取り専用変数)を作ります
グローバル変数というのはグローバルな関数スコープのローカル変数と考えてください
メソッド内では使用可能なことから分かる通り、constローカル変数の宣言時にのみ使用できます
また、クラスはメソッド内でも宣言できます
この点からもグローバルスコープとメソッドスコープの対応関係が見て取れます

readonlyは読み取り専用メンバを作るための修飾子です
クラスに属する変数はフィールドと呼ばれ、ローカル変数とは別に扱われます
機能面はconstと同等ですが、インスタンス生成時の初期化でのみ代入を受け付ける点が異なります

名前については慣例的な規則で、特に決まりはありません
ただ変数とメンバの区別をつけるために命名規則を分けるケースは多く、インスタンスによって値が変わるフィールドを定数として扱っていないのでしょう
クラス内でもインスタンスに依存しないstaticな変数については定数として大文字を当てがうパターンが主となります

0Like

Your answer might help someone💌