型エイリアス、型ガード、as演算子、ライブラリ:TypeScriptで整数型プロパティを扱う
TypeScriptでクラスプロパティが整数であることを指定する方法
型エイリアスを使用する
type Age = number;
class Person {
age: Age;
constructor(age: Age) {
this.age = age;
}
}
この方法では、number
型エイリアスAge
を作成し、それをクラスプロパティage
の型として使用します。
利点:
- 読みやすく、コードの意味が分かりやすい
- 型エイリアスを使い回すことで、コードの冗長性を減らせる
- 型エイリアスが増えすぎると、コードが煩雑になる
number型と型ガードを使用する
class Person {
age: number;
constructor(age: number) {
if (!Number.isInteger(age)) {
throw new Error('年齢は整数でなければなりません');
}
this.age = age;
}
}
この方法では、number
型のプロパティage
を初期化する際に、Number.isInteger()
関数を使って型ガードを行い、整数値でない場合はエラーを発生させます。
- 型エイリアスを作成する必要がない
- 型ガードによって、より厳密な型チェックを行える
- コードが冗長になる
- 型ガードの記述が煩雑になる
as演算子を使用する
class Person {
age: number;
constructor(age: string) {
this.age = parseInt(age, 10);
}
}
この方法では、コンストラクタで受け取ったstring
型の値をparseInt()
関数を使って整数に変換し、as
演算子を使ってnumber
型のプロパティage
に代入します。
- コードが簡潔に書ける
- 型安全性が高くない
parseInt()
関数の引数に誤った値を渡すと、エラーが発生する
ライブラリを使用する
io-ts
などのライブラリを使用することで、より簡単に型チェックを行うことができます。
import { integer } from 'io-ts';
class Person {
age: number;
constructor(age: string) {
const parsedAge = integer.decode(age);
if (parsedAge.isLeft()) {
throw new Error('年齢は整数でなければなりません');
}
this.age = parsedAge.right;
}
}
- ライブラリの学習コストがかかる
上記の4つの方法の中から、状況に応じて最適な方法を選択してください。
// 1. 型エイリアスを使用する
type Age = number;
class Person1 {
age: Age;
constructor(age: Age) {
this.age = age;
}
}
// 2. `number`型と型ガードを使用する
class Person2 {
age: number;
constructor(age: number) {
if (!Number.isInteger(age)) {
throw new Error('年齢は整数でなければなりません');
}
this.age = age;
}
}
// 3. `as`演算子を使用する
class Person3 {
age: number;
constructor(age: string) {
this.age = parseInt(age, 10);
}
}
// 4. ライブラリを使用する
import { integer } from 'io-ts';
class Person4 {
age: number;
constructor(age: string) {
const parsedAge = integer.decode(age);
if (parsedAge.isLeft()) {
throw new Error('年齢は整数でなければなりません');
}
this.age = parsedAge.right;
}
}
// 使用例
const person1 = new Person1(10);
const person2 = new Person2(10.5); // エラーが発生する
const person3 = new Person3('10');
const person4 = new Person4('10.5'); // エラーが発生する
console.log(person1.age); // 10
console.log(person2); // エラー
console.log(person3.age); // 10
console.log(person4); // エラー
このコードを実行することで、それぞれの方法の動作を確認することができます。
enum型を使用する
enum Age {
Ten = 10,
Twenty = 20,
Thirty = 30,
}
class Person {
age: Age;
constructor(age: Age) {
this.age = age;
}
}
- 使用できる値を制限できる
- 使用できる値が限定される
readonly修飾子を使用する
class Person {
readonly age: number;
constructor(age: number) {
this.age = age;
}
}
この方法では、readonly
修飾子を使用して、クラスプロパティage
を一度設定したら変更できないようにします。
- プロパティの値を誤って変更してしまうことを防げる
- プロパティの値を変更したい場合は、新しいインスタンスを作成する必要がある
デフォルト値を使用する
class Person {
age: number = 10;
constructor() {}
}
この方法では、クラスプロパティage
にデフォルト値10
を設定します。
- インスタンス作成時に
age
を指定しなくても、デフォルト値が設定される
- デフォルト値を変更したい場合は、コードを変更する必要がある
上記の4つの方法に加えて、enum
型、readonly
修飾子、デフォルト値などの方法も状況に応じて使用することができます。
typescript