TypeScriptの数値範囲制限
TypeScript で数値を特定の範囲に制限する方法
TypeScript では、型システムを利用して数値の範囲を制限することができます。これにより、ランタイムエラーを防止し、コードの信頼性を向上させることができます。
number 型の直接的な使用
最もシンプルな方法は、変数に number
型を指定することです。これにより、任意の数値を格納することができますが、範囲の制限はありません。
let num: number = 10; // 任意の数値を格納
インターフェースまたは型エイリアスによる範囲の定義
インターフェースまたは型エイリアスを使用して、数値の範囲を定義することができます。これにより、変数の型に範囲の制約を課すことができます。
インターフェースを使用
interface PositiveNumber {
value: number;
}
let positiveNum: PositiveNumber = { value: 5 }; // 0以上の値を格納
型エイリアスを使用
type Age = number; // 0以上の整数値を想定
let age: Age = 30; // 0以上の整数値を格納
ジェネリクスによる柔軟な範囲指定
ジェネリクスを使用して、より柔軟な範囲指定を実現することができます。
function clamp<T extends number>(value: T, min: T, max: T): T {
return Math.max(min, Math.min(max, value));
}
let clampedValue: number = clamp(15, 0, 10); // 10に制限される
カスタム型ガード
カスタム型ガードを使用して、数値の範囲を検証することができます。
function isPositive(num: number): num is number {
return num >= 0;
}
let num: number = 10;
if (isPositive(num)) {
// numは0以上の値であることが保証される
}
インターフェースによる範囲の定義
interface PositiveNumber {
value: number;
}
let positiveNum: PositiveNumber = { value: 5 }; // 0以上の値を格納
value
プロパティはnumber
型ですが、インターフェースの定義により、0以上の値を格納することが保証されます。PositiveNumber
インターフェースは、value
プロパティを持つオブジェクトを定義します。
型エイリアスによる範囲の定義
type Age = number; // 0以上の整数値を想定
let age: Age = 30; // 0以上の整数値を格納
- この場合、
Age
型は、0以上の整数値を想定しています。 Age
型エイリアスは、number
型に別名を付けます。
function clamp<T extends number>(value: T, min: T, max: T): T {
return Math.max(min, Math.min(max, value));
}
let clampedValue: number = clamp(15, 0, 10); // 10に制限される
clamp
関数を呼び出すときには、min
とmax
の値もnumber
型である必要があります。T
はnumber
型のサブタイプである必要があります。clamp
関数は、ジェネリック型T
を受け取り、その値をmin
とmax
の範囲内に制限します。
function isPositive(num: number): num is number {
return num >= 0;
}
let num: number = 10;
if (isPositive(num)) {
// numは0以上の値であることが保証される
}
- この型ガードは、
num
が0以上の値であることを保証します。 isPositive
関数の戻り値は、num is number
型ガードです。isPositive
関数は、数値が0以上であるかどうかを判定します。
function isPositive(num: number): num is number {
return num >= 0;
}
let num: number = 10;
if (isPositive(num)) {
// numは0以上の値であることが保証される
}
アサーション
アサーションを使用して、数値の範囲を仮定することができます。ただし、アサーションはランタイムエラーを防ぐものではなく、開発者の責任で正しい値を確保する必要があります。
let num: number = 10;
num = num as number; // 0以上の値であることを仮定
条件分岐
条件分岐を使用して、数値の範囲を直接チェックすることができます。
let num: number = 10;
if (num >= 0) {
// numは0以上の値である
} else {
// numは0未満の値である
}
ライブラリ
いくつかのライブラリは、数値の範囲を制限するためのユーティリティを提供しています。例えば、zod
ライブラリは、スキーマ定義を使用して数値の範囲を検証することができます。
import { z } from 'zod';
const positiveNumberSchema = z.number().min(0);
const result = positiveNumberSchema.safeParse(10); // 10は有効な値である
typescript types