TypeScript クラスの整数型プロパティ
宣言時の型指定
class MyClass {
// プロパティを整数型として宣言
myIntegerProperty: number;
}
number
キーワードを使用することで、myIntegerProperty
が整数型であることを明示的に指定します。
型推論
class MyClass {
// 型推論により整数型と推論される
myIntegerProperty = 10;
}
- 初期値が整数である場合、TypeScriptは自動的にその型を整数型と推論します。
readonly修飾子
class MyClass {
// プロパティを整数型かつ読み取り専用として宣言
readonly myIntegerProperty: number;
}
readonly
修飾子を追加することで、プロパティの値を変更できなくなります。
型ガード
function isInteger(value: any): value is number {
return typeof value === 'number' && Number.isInteger(value);
}
class MyClass {
myProperty: any;
// 型ガードを使用してプロパティの型を検証
setMyProperty(value: any) {
if (isInteger(value)) {
this.myProperty = value;
} else {
throw new Error('プロパティは整数型でなければなりません');
}
}
}
- 型ガードを使用して、プロパティに代入される値が整数型であることを確認できます。
TypeScript でクラスのプロパティを整数型として指定する例
class Person {
// ageプロパティを整数型として宣言
age: number;
constructor(age: number) {
this.age = age;
}
}
const person1 = new Person(30); // ageに30を代入
console.log(person1.age); // 30が出力される
- 解説
age: number
で、age
プロパティがnumber
型(数値型)であることを明示的に指定しています。- コンストラクターで
age
に値を代入する際、型が一致するためエラーになりません。
class Product {
// 型推論により、priceプロパティは整数型と推論される
price = 100;
}
const product1 = new Product();
console.log(product1.price); // 100が出力される
- 解説
- 初期値が数値であるため、TypeScript は自動的に
price
プロパティの型をnumber
型と推論します。 - 明確な型指定をしなくても、コンパイラーが適切な型を割り当ててくれます。
- 初期値が数値であるため、TypeScript は自動的に
class Circle {
// radiusプロパティを整数型かつ読み取り専用として宣言
readonly radius: number;
constructor(radius: number) {
this.radius = radius;
}
}
const circle1 = new Circle(5);
// circle1.radius = 10; // エラー: 読み取り専用のため、値を変更できない
- 解説
readonly
を付けることで、一度設定されたradius
の値を変更できなくなります。- 定数のような扱いをしたいプロパティに有効です。
class User {
id: number;
name: string;
// 引数の型をanyにして、型ガードでチェック
setId(id: any) {
if (typeof id === 'number') {
this.id = id;
} else {
console.error('IDは数値でなければなりません');
}
}
}
const user1 = new User();
user1.setId(123); // 正しい値
user1.setId('abc'); // エラーメッセージが出力される
- 解説
setId
メソッドの引数をany
型にして、柔軟な値を受け付けます。typeof id === 'number'
で、引数が数値型であるかチェックし、安全にid
プロパティに代入します。
インターフェースを使った型定義
interface PersonInterface {
age: number;
name: string;
}
class Person implements PersonInterface {
age: number;
name: string;
constructor(age: number, name: string) {
this.age = age;
this.name = name;
}
}
- 解説
- インターフェース
型定義の再利用 - 型ガード
typeof
やカスタムの型ガード関数で型をチェック - readonly
読み取り専用のプロパティ - 型推論
初期値から型を推論 - 明示的な型指定
: number
でnumber
型を指定
これらの方法を組み合わせることで、TypeScript の型システムを活用し、より安全で保守性の高いコードを書くことができます。
- 型エイリアス
複雑な型に名前を付けて、コードの可読性を向上させます。 - enum
列挙型を使って、特定の値の集合を定義できます。 - bigint
より大きな整数を扱う場合はbigint
型を使用します。
interface IPerson {
age: number;
name: string;
}
class Person implements IPerson {
// インターフェースの型定義に従ってプロパティを定義
age: number;
name: string;
constructor(age: number, name: string) {
this.age = age;
this.name = name;
}
}
- デメリット
- メリット
- 型定義をクラスから分離することで、コードの再利用性と可読性を向上させます。
- 複数のクラスで共通の型定義を共有できます。
型エイリアスによる簡潔な定義
type PersonType = {
age: number;
name: string;
};
class Person implements PersonType {
// 型エイリアスで定義した型を使用
age: number;
name: string;
// ...
}
- デメリット
- メリット
ジェネリクスを用いた柔軟な型定義
class MyClass<T> {
value: T;
constructor(value: T) {
this.value = value;
}
}
const myNumberClass = new MyClass<number>(10); // 整数型
const myStringClass = new MyClass<string>("hello"); // 文字列型
- デメリット
- コードが複雑になる可能性があります。
- メリット
readonly と private を組み合わせたカプセル化
class Counter {
private _count: number = 0;
get count(): number {
return this._count;
}
increment() {
this._count++;
}
}
- デメリット
- メリット
型アサーションによる型変換
class MyClass {
value: any;
setValue(value: any) {
this.value = value as number; // 型アサーションでnumber型に変換
}
}
- デメリット
- 型の安全性に関する保証が薄れます。
- メリット
- Mapped型
配列やオブジェクトの要素の型を一括で変更したい場合に利用できます。 - Intersection型
複数の型の共通部分を取り出したい場合に利用できます。 - Union型
複数の型を許容したい場合に利用できます。
どの方法を選ぶべきか?
- 柔軟性
型アサーションが適していますが、慎重に使用する必要があります。 - カプセル化
readonly と private を組み合わせる方法が適しています。 - 汎用性
ジェネリクスが適しています。 - 明確な型定義
インターフェースや型エイリアスが適しています。
状況に応じて最適な方法を選択し、TypeScript の型システムを最大限に活用しましょう。
- TypeScript の公式ドキュメントやコミュニティで最新の情報を収集することをおすすめします。
- TypeScript の型システムは日々進化しており、新しい機能や書き方が登場しています。
キーワード
TypeScript, クラス, プロパティ, 整数型, 型指定, インターフェース, 型エイリアス, ジェネリクス, readonly, private, 型アサーション, Union型, Intersection型, Mapped型
関連する情報
- Qiita や Zenn などの技術ブログ
- TypeScript のコミュニティフォーラム
- TypeScript の公式ドキュメント
typescript