クラス
次のような人を表す Person クラスを考えてみましょう。
class Person {
name: string;
age: number;
constructor(name: string, age: number){
this.name = name;
this.age = age;
}
sayHello(){
return `My name is ${this.name}. I'm ${this.age} years old.`;
}
}
let p = new Person('Mike', 25);
let s = p.sayHello();
console.log(s);
コンストラクタで名前 (name) と年齢 (age) を受け取っています。
ここで作った sayHello メソッドを呼ぶと、文字列が返りますが、 この文字列の中にコンストラクタで渡した値が入ります。
実行結果は次の通りです。
My name is Mike. I'm 25 years old.
上記と同様の意味として、コンストラクタの引数を public に指定して、次のようにも書けます。
class Person {
constructor(public name: string, public age: number){
}
sayHello(){
return `My name is ${this.name}. I'm ${this.age} years old.`;
}
}
let p = new Person('Kevin', 20);
let s = p.sayHello();
console.log(s);
この書き方は Angular などでディペンデンシ・インジェクションを実装する時によく使いますので、覚えておくといいです。
メンバーは既定で public アクセス
クラスのメンバーはデフォルトで public アクセスできます。
class Person {
name: string;
age: number;
constructor(name: string, age: number){
this.name = name;
this.age = age;
}
sayHello(){
return `My name is ${this.name}. I'm ${this.age} years old.`;
}
}
let p = new Person('Mike', 22);
let s = p.sayHello();
console.log(p.age);
22
ここで age メンバーを private とマークすると、 クラスの外部から age に直接アクセスしている箇所があるために、コンパイル時にエラーとなります。
class Person {
name: string;
private age: number;
constructor(name: string, age: number){
this.name = name;
this.age = age;
}
...
}
let p = new Person('Mike', 22);
let s = p.sayHello();
console.log(p.age);
$ tsc foo.ts foo.ts(18,15): error TS2341: Property 'age' is private and only accessible within class 'Person'.
クラスの継承
TypeScript では extends キーワードでクラスを継承できます。次の例では Person クラスを継承して、Employee クラスを定義しています。
class Person {
name: string;
age: number;
constructor(name: string, age: number){
this.name = name;
this.age = age;
}
sayHello(){
return `My name is ${this.name}. I'm ${this.age} years old.`;
}
}
class Employee extends Person {
title: string;
constructor(name: string, age: number, title: string){
super(name, age);
this.title = title;
}
}
let p = new Employee('Ichiro', 35, 'Manager');
let s = p.sayHello();
console.log(s);
console.log(p.title);
この実行結果は次のようになります。
My name is Ichiro. I'm 35 years old. Manager
確かに派生クラスのオブジェクトから、ベースクラスのメソッドが呼び出せていますね。
派生クラスのコンストラクタでは super メソッドを呼ぶ必要があります。super メソッドはベースクラスのコンストラクタを呼び出すので、 関連のあるすべてのクラスが正しく初期化されます。