TypeScriptでコンストラクタ引数にアクセス修飾子を使う書き方を徹底解説!初心者向けオブジェクト指向入門
生徒
「先生、TypeScriptでクラスを作るときに、コンストラクタってよく出てきますけど、引数にアクセス修飾子を付ける方法があるって聞いたんです。どういうことですか?」
先生
「いい質問ですね。アクセス修飾子というのは、クラスの外から見える範囲を決めるためのものです。コンストラクタ引数にアクセス修飾子を付けると、わざわざプロパティを定義しなくても、自動的にクラスのプロパティとして扱われるんです。」
生徒
「なるほど!でもプロパティを省略できるってどういうことですか?コードを見せてもらえますか?」
先生
「もちろんです。まずは通常の書き方と比べて、アクセス修飾子を使った書き方を見てみましょう。」
1. コンストラクタとは?
TypeScriptのコンストラクタ(constructor)は、クラスからオブジェクトを作るときに最初に呼ばれる特別なメソッドです。オブジェクトとは、プログラムの中でデータと処理をまとめた「入れ物」のようなものです。たとえば「生徒」というオブジェクトを作ると、名前や年齢などの情報を持たせることができます。
通常は、クラスの中でプロパティ(変数のようなもの)を宣言し、それをコンストラクタで初期化します。これが基本の使い方です。
2. アクセス修飾子とは?
アクセス修飾子は、クラスの外からそのプロパティやメソッドが「見える」かどうかを制御するための仕組みです。TypeScriptでは以下の3種類があります。
- public:どこからでもアクセスできる。
- private:クラスの中からしかアクセスできない。
- protected:クラスとその子クラス(継承したクラス)からアクセスできる。
これをコンストラクタの引数につけることで、宣言と代入を一度に済ませることができます。まるで「名札を書いたら同時に胸につけられる」ようなイメージです。
3. 通常の書き方とアクセス修飾子を使った書き方
まずは通常のクラス定義の例を見てみましょう。
class Student {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const s1 = new Student("太郎", 20);
console.log(s1.name); // 太郎
太郎
上の例では、プロパティをあらかじめ宣言してからコンストラクタで代入しています。これでも問題ありませんが、コードが少し長くなってしまいます。
次にアクセス修飾子を使った書き方です。
class Student {
constructor(public name: string, private age: number) {}
}
const s2 = new Student("花子", 18);
console.log(s2.name); // 花子
// console.log(s2.age); // エラー:privateなので外からは見えない
花子
この書き方では、public nameやprivate ageと書くだけで、自動的にプロパティが作られ、値が代入されます。つまり、余分な記述を省いてスッキリ書けるのです。
4. アクセス修飾子を使うメリット
この書き方を使うことで、以下のようなメリットがあります。
- コードが短くなるため、見やすく保守しやすい。
- アクセス修飾子を付けることで、データの公開範囲を明確にできる。
- コンストラクタで値を受け取るだけで、自動的にプロパティが初期化される。
例えば「生徒の名前は外から見えるけど、年齢は非公開にしたい」という場合も、アクセス修飾子を使えば簡単に実現できます。
5. 具体的な活用例
最後に、少し実践的な例を見てみましょう。
class Book {
constructor(
public title: string,
private price: number
) {}
getInfo(): string {
return `本のタイトル: ${this.title}`;
}
getPrice(): number {
return this.price;
}
}
const book = new Book("TypeScript入門", 2500);
console.log(book.getInfo());
// console.log(book.price); // エラー:privateなので直接アクセス不可
console.log(book.getPrice());
本のタイトル: TypeScript入門
2500
この例では、本のタイトルはpublicなので外部から自由に参照できますが、価格はprivateにしてあるため外から直接アクセスできません。代わりに、getPriceメソッドを用意して必要なときだけ取得できるようにしています。これにより、大切な情報を守りつつ、必要な情報だけ公開するという「情報隠蔽」の考え方を自然に学ぶことができます。
まとめ
コンストラクタ引数とアクセス修飾子で広がるTypeScriptの書き方
TypeScriptでクラスを扱うとき、「プロパティの宣言」と「コンストラクタでの代入」を別々に書くのが当たり前だと思っていた人も多いでしょう。 しかし、アクセス修飾子をコンストラクタ引数に付けるだけで、宣言と代入を同時にまとめられるという便利な書き方があります。 これは特に「プロパティが多いクラス」や「初期化が中心のクラス」を作るときに効果を発揮し、コードが驚くほど読みやすくなります。
また、アクセス修飾子であるpublic、private、protectedを使うことで、 クラス内部の情報がどこまで外部に公開されるかを細かく調整できるようになります。 外部に見せていい情報はpublic、見せたくない情報はprivate、継承したクラスで使いたい情報はprotectedといった使い分けができ、 TypeScriptのオブジェクト指向がより理解しやすくなるでしょう。 とくに今回の内容は、JavaScriptにはないTypeScriptならではの書き方でもあるため、初心者のうちから習得しておくと、 その後のクラス設計が格段に楽になります。
アクセス修飾子を使った書き方のメリットを振り返る
アクセス修飾子付きコンストラクタの書き方には、見た目のスッキリ感以上に大きな価値があります。 冗長なコードを減らせるだけでなく、プロパティを宣言し忘れるミスを防ぎ、データの意図しない公開を避けることもできます。 初心者にとっては「最初から分かりやすいコードを書く習慣」を自然と身につけるきっかけになり、 中級者・上級者になったときにも役立つ「情報整理の技術」を学ぶことにつながります。 また、TypeScript特有の型チェックとの組み合わせにより、コード上の間違いにすぐ気付くことができる点も魅力です。
アクセス修飾子付きコンストラクタの応用例
ここで、少し応用したサンプルプログラムを紹介します。 「ユーザー情報」と「ログイン機能」を持つ簡易的なクラスを例にしながら、アクセス修飾子がどのように役立つのか確認してみましょう。
class User {
constructor(
public username: string,
private password: string,
protected role: string
) {}
login(): string {
return `${this.username}さんがログインしました`;
}
getRole(): string {
return `権限: ${this.role}`;
}
}
class AdminUser extends User {
showAdminMessage(): string {
return `${this.username}は管理者権限を持っています`;
}
}
const admin = new AdminUser("山田", "secret123", "admin");
console.log(admin.login());
console.log(admin.getRole());
// console.log(admin.password); // privateなので外部アクセス不可
console.log(admin.showAdminMessage());
この例では、ユーザー名はpublicなので外部から自由に読めますが、パスワードはprivateで外部アクセス不可になっています。 ロール(権限)はprotectedのため、継承したクラスから参照できます。 管理者ユーザー(AdminUser)では、roleにアクセスしつつ独自メソッドを追加しています。 このようにアクセス修飾子を上手に組み合わせることで、安全性と柔軟性を両立したクラス設計が可能になります。
TypeScriptを使うメリットを実感しよう
TypeScriptの強力な型システムとアクセス修飾子の組み合わせは、JavaScriptにはない安全性と分かりやすさを生み出します。 初めて学ぶときには少し難しく感じるかもしれませんが、慣れてしまうと「なぜ今まで使わなかったのか」と思えるほど便利な機能です。 特にオブジェクト指向の考え方を身につけたい初心者にとって、コンストラクタとアクセス修飾子は絶好の練習材料になります。
生徒
「先生、アクセス修飾子付きコンストラクタって便利ですね。普通の書き方よりずっと読みやすいです!」
先生
「そうでしょう?TypeScriptの強みは型とクラスの仕組みを使って安全に設計できるところなんです。特に今回の書き方は、プロパティを宣言し忘れるミスも減りますしね。」
生徒
「publicやprivateの違いも分かってきました!外から見られたくない情報を守れるのはいいですね。」
先生
「その通りです。情報を必要な範囲だけに公開するのは、プログラミングでもとても大切な考え方なんですよ。」
生徒
「今日のまとめで理解が深まりました!これからクラスを作るときは、アクセス修飾子を積極的に使ってみます!」