クラス

次のような人を表す 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 メソッドはベースクラスのコンストラクタを呼び出すので、 関連のあるすべてのクラスが正しく初期化されます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 JavaScript 入門