1static メソッドの最小形
static メソッドはインスタンスを作らず、クラス名から直接呼び出します。引数だけで結果が決まる変換・計算のような処理は、インスタンスを作る意味がないので static にまとめます。Math.max などの組み込みメソッドと同じ作りです。
class TemperatureUtil {
// インスタンスを作らず、クラス名から直接呼ぶ
static toFahrenheit(celsius: number): number {
return celsius * 1.8 + 32;
}
}
// new TemperatureUtil() は不要
console.log(TemperatureUtil.toFahrenheit(20));
console.log(TemperatureUtil.toFahrenheit(30));
2static プロパティ — クラスに1つだけの値
static プロパティは「クラス全体で1つだけ」存在する値です。再試行回数のような設定値の置き場所に向いていて、書き換えるとそのクラスを使うすべての場所に効きます。static メソッドからは「クラス名.プロパティ名」で参照します。
class RetryPolicy {
static maxRetries: number = 3;
static describe(): string {
return "最大 " + RetryPolicy.maxRetries + " 回まで再試行";
}
}
console.log(RetryPolicy.maxRetries);
console.log(RetryPolicy.describe());
RetryPolicy.maxRetries = 5; // クラスに1つだけの値を書き換える
console.log(RetryPolicy.describe());
3static とインスタンスメンバーの対比
visitorName はインスタンスごとに別の値を持ち、totalCount はクラスに1つだけで全インスタンスから共有されます。コンストラクタの中で static プロパティを増やすと、「このクラスが何個作られたか」をクラス自身が数えられます。両者の所属の違いを確かめてください。
class Visitor {
static totalCount: number = 0; // 全インスタンスで共有
visitorName: string; // インスタンスごとに別
constructor(visitorName: string) {
this.visitorName = visitorName;
Visitor.totalCount = Visitor.totalCount + 1;
}
}
const taroVisitor = new Visitor("Taro");
const hanakoVisitor = new Visitor("Hanako");
console.log(taroVisitor.visitorName);
console.log(hanakoVisitor.visitorName);
console.log(Visitor.totalCount); // 2
4static ファクトリメソッド — new の入り口を用意する
static メソッドの中で new して返す形をファクトリメソッドと呼びます。Temperature.fromText のように「何から作るのか」を名前で表せるのが利点で、Array.from など組み込みにも同じ形があります。入力の変換をコンストラクタの外に出せるので、作り方が複数あるクラスで重宝します。
class Temperature {
celsius: number;
constructor(celsius: number) {
this.celsius = celsius;
}
// 文字列から作る入り口を static で用意する
static fromText(text: string): Temperature {
return new Temperature(Number(text));
}
describe(): string {
return this.celsius + "度";
}
}
const fromInput = Temperature.fromText("25");
console.log(fromInput.describe());
console.log(new Temperature(30).describe());
5シングルトン的なカウンタ
private constructor と static を組み合わせると、インスタンスを全体で1つに保つシングルトン風の作りになります。どこから shared() を呼んでも同じ実体が返るため、カウンタの値が積み上がっていきます。アプリ全体で共有する設定やキャッシュの管理に使われる形です。
class AccessCounter {
private static instance: AccessCounter | null = null;
private total: number = 0;
private constructor() {} // 外から new させない
static shared(): AccessCounter {
if (AccessCounter.instance === null) {
AccessCounter.instance = new AccessCounter();
}
return AccessCounter.instance;
}
record(): number {
this.total = this.total + 1;
return this.total;
}
}
console.log(AccessCounter.shared().record()); // 1
console.log(AccessCounter.shared().record()); // 2(同じ実体を共有)