TypeScript 入門の記録(57)プロを目指す人のためのTypeScript入門(41)第5章TypeScriptのクラス
「第1回 自作CPUを語る会」の会場提供のため、東京出張しています。「自作CPU愛」が詰まった「第1回 自作CPUを語る会」の様子は#meke_cpu をご覧ください。 前回は、第4章「関数」のまとめとして、力試しの問題にチャレンジしました。今日はTypeScriptのクラスについて学習します💪
クラスの宣言と使用
他のプログラミング言語でもおなじみのクラスですが、TypeScriptの場合オブジェクトの生成にクラスは必須ではないので、どんなときにクラスが必要かも併せて理解していきたいと思います。
クラス宣言
クラス宣言も文の一種で、 class {…} という構文です。クラスをもとに生成されたオブジェクトはインスタンスと呼ばれます。クラスの定義の本体で、インスタンスがどのようなプロパティやメソッドを持つかを宣言します。クラスも変数であり、クラス宣言は「クラスが入った変数」を宣言する構文です。クラスは、他の変数に代入したり、オブジェクトのプロパティにすることもできます。
class User511 {
name: string = "";
age: number = 0;
}
// Userクラスが入ったオブジェクト
const obj511 = {
cl: User511
};
const uhyo = new obj511.cl(); // Userのインスタンスを生成して代入できる
console.log(uhyo.age); // ageの初期値、0が表示される
プロパティ宣言
クラスのプロパティ宣言の基本構文は、 プロパティ名: 型 = 式; で、右辺の式には初期値を設定します。オブジェクトと同様にオプショナルなプロパティ、読み取り専用のプロパティも宣言ができます。読み取り専用のプロパティには値の代入ができませんが、コンストラクタのみ値を代入できます。
class User511 {
readonly name: string;
age: number;
constructor(name: string, age:number){
this.name = name;
this.age = age;
}
}
メソッド宣言
クラス定義にはメソッド宣言を含むことができ、インスタンス生成時には、そのメソッドを持った状態になります。これも他のプログラミング言語と共通しているので、違和感ありません。
class User511 {
readonly name: string;
age: number;
constructor(name: string, age:number){
this.name = name;
this.age = age;
}
// 成人ならtrueを返すメソッド
isAdult(): boolean {
return this.age >= 18;
}
// ageを設定するメソッド
setAge(newAge: number) {
this.age = newAge;
}
}
コンストラクタ
コンストラクタは、クラスのインスタンスを生成するときに実行される関数です。クラスの各プロパティ宣言に初期値が与えられていなくても、コンストラクタで初期値が与えられればOKです。コンストラクタでプロパティに初期値を与える場合は、条件の漏れで初期値が与えられないルートが残っているとコンパイルエラーが発生します。初期化漏れのリスクが減らせるので良いと思いました。
さて、他のプログラミング言語と同じように、異なる引数のコンストラクタを宣言できるか試したところ、"Multiple constructor implementations are not allowed."というエラーが発生しました。というわけで、引数違いのコンストラクタは宣言できませんでした。
まとめ
今日は、TypeScriptのクラス宣言について学習しました。他のプラグラミング言語と共通の部分と、異なる部分があるので、少々戸惑いましたが、慣れていないだけなので、今後違和感も感じなくなると思います。今日の学習はここまでにします。次回は、次の週末の予定です。