JavaScript 入門

ホーム > TypeScript > クラス

クラス

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);

実行結果は次の通りです。

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

ホーム > TypeScript > クラス