【TypeScript】二項演算子の12の基本と応用例で完全マスター!

TypeScriptの二項演算子の使い方と応用例TypeScript
この記事は約28分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

TypeScriptの二項演算子の使い方と応用例に関する情報を探している方へ。

この記事は、初心者でも理解できるようにTypeScriptの二項演算子の基本的な使い方から応用技術、注意点までを12の詳細なサンプルコードとともに解説します。

どのようなスキルレベルの方でも、TypeScriptの二項演算子を完全にマスターできる内容になっています。

●TypeScriptとは

TypeScriptはJavaScriptのスーパーセットとして知られ、Microsoftによって開発されました。

それはJavaScriptに静的型付けとその他いくつかの便利な機能を追加し、大規模なプロジェクトの管理を容易にします。

この強力なプログラミング言語は、型安全性を提供しながらもJavaScriptとの高い互換性を維持しています。

○TypeScriptの特徴

TypeScriptの主な特徴は、開発者が効果的にコードを書き、エラーを回避し、プロジェクトをより管理しやすくするための様々な機能が組み込まれていることです。

型安全性を提供する静的型付けシステム、JavaScriptとの互換性の維持、多くのIDEにおける強力なツールサポート、充実したコミュニティとエコシステムにより、開発体験が大幅に向上します。

これらの特徴により、個々の開発者だけでなく、大規模なチームにとってもTypeScriptは価値のある選択となります。

□型安全性

TypeScriptは静的型付けを導入し、コンパイル時に型の不整合やエラーを検出します。

これにより、ランタイムエラーを大幅に削減できます。

□高い互換性

TypeScriptはJavaScriptのスーパーセットであるため、既存のJavaScriptコードはTypeScriptとしても機能します。

□強力なツールセット

TypeScriptは高度なエディタの支援を提供し、コード補完やリファクタリングを簡単かつ効率的に行えます。

□コミュニティとエコシステム

TypeScriptは急成長しているコミュニティに支えられ、多くのライブラリやツールが利用可能です。

○コードの具体例

それでは、具体的なコードと、その特徴がどのように動作するのかを詳しく解説します。

let x: number = 5; // 型注釈を使用して変数xの型を指定します。

このコードでは、変数xに数値型を割り当てています。

型注釈を使用すると、コンパイラが型の誤りを事前に識別しやすくなります。

○JavaScriptとの違い

JavaScriptとTypeScriptの最大の違いは、前述したように型システムです。

JavaScriptは動的型付け言語であり、変数の型はランタイム時に解決されます。

一方、TypeScriptは静的型付けを採用しており、コンパイル時に型の検査が行われます。

さらに、TypeScriptは次のような機能を提供しており、JavaScriptにはない特徴となっています。

  1. インターフェイス:コードの構造を定義し、特定のプロパティやメソッドが存在することを保証します。
  2. ジェネリクス:型の再利用と型安全性を提供し、柔軟なコードの作成を助けます。

それでは、JavaScriptとTypeScriptの違いを表す基本的なコードとその説明を行います。

JavaScriptコード例:

function add(a, b) {
  return a + b;
}

TypeScriptコード例:

function add(a: number, b: number): number {
  return a + b;
}

このコードを見ると、TypeScript版は関数のパラメータと戻り値に型を指定しています。

これにより、コンパイラは関数が正しい型の引数で呼び出され、正しい型の値を返すことを保証できます。

このように、TypeScriptはJavaScriptに比べて堅牢なコードを書くのに役立つ機能を提供します。

また、これにより開発者はコードのバグを早期に検出し、修正が可能となります。

●二項演算子の基本

TypeScriptのプログラミング世界において、二項演算子は非常に基本的かつ強力なツールです。

ここでは、TypeScriptにおける二項演算子の基本的な側面と使用方法を、細かく詳細に解説します。

二項演算子は、二つの値(オペランド)を取り、それらに対するある種の操作を行い、一つの結果を返します。

例えば、算術演算子、比較演算子、論理演算子などが存在します。

○二項演算子とは

二項演算子は、名前の通り2つの引数(またはオペランド)を取る演算子のことを指します。

これは、特定の操作を二つの変数や値に適用し、一つの結果を生成するために使用されます。

主に、算術計算や条件判定に用いられます。

TypeScriptにおける二項演算子は非常に多岐にわたり、プログラムの多くの側面に影響を与えます。

そのため、それぞれの二項演算子がどのような動作を行うかを理解することは、効果的なプログラミングのために重要となります。

○TypeScriptでの使用方法

では、TypeScriptで二項演算子をどのように使用するかについて、具体的なサンプルコードと共に解説します。

□算術演算子

算術演算子は、基本的な数学的計算を行うための演算子です。

下記のコードは、算術演算子の基本的な使い方を表しています。

// 加算
let sum = 5 + 3;
console.log(sum); // このコードを実行すると、8が出力されます。

// 減算
let difference = 5 - 3;
console.log(difference); // このコードを実行すると、2が出力されます。

// 乗算
let product = 5 * 3;
console.log(product); // このコードを実行すると、15が出力されます。

// 除算
let quotient = 8 / 2;
console.log(quotient); // このコードを実行すると、4が出力されます。

上記のサンプルコードでは、基本的な算術演算子(+, -, *, /)を使用して、二つの数値間の加算、減算、乗算、除算を行っています。

コードを実行すると、それぞれの計算結果がコンソールに出力されることを確認できます。

□比較演算子

比較演算子は、二つの値を比較し、その比較結果を真偽値(true または false)として返す演算子です。

下記のコードは、比較演算子の基本的な使い方を表しています。

// 等価比較
let isEqual = 5 == 5;
console.log(isEqual); // このコードを実行すると、trueが出力されます。

// 不等価比較
let isNotEqual = 5 != 3;
console.log(isNotEqual); // このコードを実行すると、trueが出力されます。

// 大小比較
let isGreaterThan = 5 > 3;
console.log(isGreaterThan); // このコードを実行すると、trueが出力されます。

let isLessThan = 3 < 5;
console.log(isLessThan); // このコードを実行すると、trueが出力されます。

以上のサンプルコードでは、等価比較(==)、不等価比較(!=)、大小比較(>、<)を利用しています。

これらの演算子は、オペランド間の関係を判定し、その結果をブール値として返します。

このブール値は、条件分岐などの制御フローの中で非常に有用です。

○サンプルコード1:算術演算子を用いた計算

初めてTypeScriptを学ぶ方でも理解しやすいよう、算術演算子の基本とその使い方を一緒に見ていきましょう。

算術演算子は数値に対して算術計算を行うための演算子です。

ここでは、加算、減算、乗算、除算、剰余の5つの基本的な演算を行うサンプルコードをご紹介します。

まずは、次のサンプルコードをご覧ください。

let a: number = 5;
let b: number = 3;

// 加算
let additionResult: number = a + b;
console.log(`加算の結果: ${additionResult}`);  // 出力: 加算の結果: 8

// 減算
let subtractionResult: number = a - b;
console.log(`減算の結果: ${subtractionResult}`);  // 出力: 減算の結果: 2

// 乗算
let multiplicationResult: number = a * b;
console.log(`乗算の結果: ${multiplicationResult}`);  // 出力: 乗算の結果: 15

// 除算
let divisionResult: number = a / b;
console.log(`除算の結果: ${divisionResult}`);  // 出力: 除算の結果: 1.6666666666666667

// 剰余
let modulusResult: number = a % b;
console.log(`剰余の結果: ${modulusResult}`);  // 出力: 剰余の結果: 2

このコードでは、abという二つの変数を宣言し、それぞれに数値を代入しています。

次に各種算術演算子(+、-、*、/、%)を使って、基本的な算術計算を行い、その結果をコンソールに表示しています。

○サンプルコード2:比較演算子での条件判定

比較演算子は、二つの値を比較し、その結果を真偽値(true or false)で返します。

比較演算子には、等価(==)、不等価(!=)、厳密等価(===)、厳密不等価(!==)、より大きい(>)、より小さい(<)、より大きいか等しい(>=)、より小さいか等しい(<=)などがあります。

ここでは、これらの基本的な比較演算子の使用方法とサンプルコードを詳しく解説します。

下記のサンプルコードは、いくつかの異なる比較演算子を用いて、変数aとbの関係を判定するものです。

let a: number = 5;
let b: number = 3;

// 等価
if (a == b) {
    console.log(`変数aとbは等しいです。`);
} else {
    console.log(`変数aとbは等しくありません。`); // 出力:変数aとbは等しくありません。
}

// 厳密等価
if (a === b) {
    console.log(`変数aとbは型と値が完全に一致しています。`);
} else {
    console.log(`変数aとbは型と値が一致していません。`); // 出力:変数aとbは型と値が一致していません。
}

// より大きい
if (a > b) {
    console.log(`変数aはbより大きいです。`); // 出力:変数aはbより大きいです。
} else {
    console.log(`変数aはbより大きくありません。`);
}

// より小さい
if (a < b) {
    console.log(`変数aはbより小さいです。`);
} else {
    console.log(`変数aはbより小さくありません。`); // 出力:変数aはbより小さくありません。
}

このコードでは、まず変数aとbを宣言し、それぞれに数値を代入しています。

次に、いくつかの比較演算子を使って条件判定を行い、その結果をコンソールに表示しています。

○サンプルコード3:論理演算子を使った条件組み合わせ

今回は、TypeScriptでの論理演算子を使った条件組み合わせについて掘り下げていきます。

論理演算子は、複数の条件を組み合わせて複雑な条件判断を行う際に非常に役立つツールとなります。

今回はこれに焦点を当て、基本的な使い方から応用例までを一緒に解説していきます。

では、早速詳細な説明とサンプルコードを通してこのトピックを探求していきましょう。

まず、基本となる論理演算子は3種類存在します。

これらは「&&」(AND演算子)、 「||」(OR演算子)、そして「!」(NOT演算子)となります。

それぞれの演算子の基本的な挙動を確認した後、それらを組み合わせたサンプルコードを作成し、実行結果も交えて解説していきます。

では、最初に基本的な論理演算子について簡単に見ていきましょう。

「&&」は、すべての条件が真(true)である場合に真(true)を返します。

一方で、「||」は少なくとも1つの条件が真(true)である場合に真(true)を返し、「!」は条件の真偽を反転させます。

次に、これらの演算子を組み合わせた条件式のサンプルコードをご紹介します。

let age = 25;
let income = 3000000;
let married = false;

// 以下の条件式は、ageが20以上かつincomeが300万以上の場合にtrueとなります
let condition1 = age >= 20 && income >= 3000000;

// 以下の条件式は、ageが30以下またはmarriedがfalseの場合にtrueとなります
let condition2 = age <= 30 || married === false;

// 以下の条件式は、marriedがfalseの逆、すなわちtrueの場合にtrueとなります
let condition3 = !married;

console.log("condition1 の結果:", condition1); // condition1 の結果: true
console.log("condition2 の結果:", condition2); // condition2 の結果: true
console.log("condition3 の結果:", condition3); // condition3 の結果: true

このコードでは、age, income, marriedという3つの変数を使って複数の条件を設定しています。

そして、「&&」、「||」、そして「!」という論理演算子を用いて条件式を作成しています。

このコードを実行すると、それぞれの条件式の結果がコンソールに表示されます。

このように、論理演算子を使うことで複雑な条件判断を行うことができます。

特に、複数の条件が組み合わさった場合には、これらの論理演算子を活用することでコードが読みやすく、理解しやすくなります。

さらに活用的な使い方として、条件式を入れ子にすることも可能です。

この場合、複数の論理演算子を組み合わせて、更に複雑な条件を作成することができます。

それでは、そのようなサンプルコードをご紹介します。

let condition4 = (age >= 20 && income >= 3000000) || (married === false && age <= 30);

console.log("condition4 の結果:", condition4); // condition4 の結果: true

このコードでは、condition4という新しい条件式を作成しています。

この条件式は、ageが20以上かつincomeが300万以上、または、marriedがfalseかつageが30以下の場合にtrueとなります。

組み合わせた複雑な条件も、論理演算子を活用して清潔に表現することができます。

●二項演算子の応用例

TypeScriptにおける二項演算子は、プログラムのロジック構築において非常に有用なツールとなります。

ここでは、初心者でもわかりやすいように、二項演算子の基本的な用途を解説します。

実行後のコードも交えて解説するので、ぜひ参考にしてください。

○サンプルコード4:条件(三項)演算子を使った簡易if文

条件(三項)演算子は、条件 ? 真の場合の値 : 偽の場合の値という形式で使用されます。

このコードを実行すると、指定した条件が真か偽かを評価し、それに応じて異なる結果を返します。

それでは、具体的なサンプルコードを紹介します。

let score: number = 85;
let result: string = score >= 80 ? '合格' : '不合格';
console.log(result); // 結果:合格

このコードではscore変数に数値85を代入し、条件演算子を用いてscoreが80以上なら’合格’を、そうでなければ’不合格’をresult変数に代入しています。

このコードを実行すると、console.logで’合格’が出力される結果が得られます。

このように条件(三項)演算子を利用することで、コードを簡潔に記述することが可能です。

また、条件演算子はネストすることも可能です。

下記のコードはさらなる応用例として参考にしてください。

let age: number = 25;
let category: string = age < 18 ? '未成年' : age < 65 ? '成人' : '高齢者';
console.log(category); // 結果:成人

このコードでは、age変数に数値25を代入し、二段階の条件演算子を用いて18未満、18以上65未満、65以上の三つのカテゴリーに分けています。

このコードを実行すると、console.logで’成人’が出力される結果が得られます。

○サンプルコード5:null合体演算子での初期値設定

TypeScriptにおけるnull合体演算子(??)は、ある変数がnullまたはundefinedである場合に、デフォルト値を設定するために使用されます。

この演算子は、プログラミング時に初期値の設定を行う際に非常に便利です。

それでは、具体的な使用方法とその詳細な説明を行います。

まず初めに、基本的なサンプルコードを紹介します。

このコードでは、変数inputValueの値がnullまたはundefinedの場合に、変数defaultValueを使ってデフォルトの値を設定しています。

let inputValue: number | null = null;
let defaultValue: number = 10;

let resultValue = inputValue ?? defaultValue;
console.log(resultValue);  // 出力: 10

このコードを実行すると、inputValueがnullなので、defaultValueの値10がresultValueに設定され、その値がコンソールに出力されます。

次に、このコードの解析を行いましょう。

最初に、inputValueという名前の変数を宣言し、nullを代入しています。

また、型注釈としてnumber | nullを指定しています。

これは、inputValueが数値またはnullであることを表しています。

次に、defaultValueという名前の変数を宣言し、初期値として10を代入しています。

その後、null合体演算子(??)を使用して、inputValueがnullまたはundefinedの場合にdefaultValueを返すような式を作成しています。

そして、この結果をresultValueという変数に代入しています。

最後に、console.logを使って、resultValueの値をコンソールに出力しています。

このコードの実行結果は、inputValueがnullなのでdefaultValueの値10がresultValueに設定されるため、コンソールには10と表示されます。

また、もしinputValueに数値が設定されている場合、その数値がresultValueに設定されるという挙動を表します。

let inputValue: number | null = 5;
let defaultValue: number = 10;

let resultValue = inputValue ?? defaultValue;
console.log(resultValue);  // 出力: 5

このコードを実行すると、inputValueが5なので、null合体演算子はinputValueの値をそのままresultValueに設定します。

そのため、コンソールには5と表示されます。

○サンプルコード6:代入演算子を用いた簡略記法

代入演算子は、変数に値を割り当てる基本的な演算子ですが、簡略記法を利用することで、変数への操作を簡単かつ効率的に行うことができます。

ここでは、代入演算子の簡略記法とそれを利用したサンプルコードを解説していきます。

まず、次の基本的な代入演算子とその簡略記法を理解しましょう。

  • =:代入
  • +=:加算後、代入
  • -=:減算後、代入
  • *=:乗算後、代入
  • /=:除算後、代入
  • %=:余剰後、代入

それでは、これらの代入演算子を利用した具体的なサンプルコードとその詳細な説明を見ていきましょう。

下記のコードは、代入演算子の基本的な利用方法を表しています。

let x = 5; // xに5を代入
x += 3; // xの現在の値に3を加え、その結果をxに再代入(xは8になります)

このコードでは、初めに変数xに5を代入しています。

その後、+= 演算子を使用して、xの現在の値(5)に3を加え、その結果をxに再代入しています。

このコードを実行すると、xは8になります。

また、複合代入演算子を利用すると、計算と代入を一つのステップで行うことができます。

下記のコードは、複合代入演算子を使用した計算の簡略化を表しています。

let y = 10;
y *= 2; // yの現在の値に2を掛け、その結果をyに再代入(yは20になります)

このコードでは、変数yに10を代入した後、*= 演算子を使ってyの現在の値(10)に2を掛け、その結果をyに再代入しています。

このコードを実行すると、yは20になります。

これらのコードの解説からわかるように、複合代入演算子を用いるとコードが短くなり、読みやすくなります。

また、変数の更新が一行で行えるので、コードの見通しも良くなります。

●二項演算子の詳細な使い方

TypeScriptの二項演算子は、さまざまな操作を行う際に欠かせない機能の一つです。

ここでは、二項演算子の中でも特に使用頻度が高い「文字列結合」に関する詳細な使い方とそのサンプルコードをご紹介します。

○サンプルコード7:文字列結合

二項演算子の中で、非常に一般的なものとして「+」演算子があります。

この演算子は、数字同士の加算だけでなく、文字列同士の結合にも使用されます。

このコードでは、文字列の変数「firstName」と「lastName」を結合して、フルネームを生成しています。

let firstName: string = "太郎";
let lastName: string = "田中";
let fullName: string = firstName + " " + lastName;
console.log(fullName);

このコードを実行すると、”太郎 田中”という結果が得られます。

これは、「+」演算子を利用して二つの文字列を結合した結果となります。

しかし、ここで注意が必要です。

数字と文字列を「+」演算子で結合しようとすると、数字が自動的に文字列に変換され、両者が文字列として結合されるという挙動になります。

この特性は、予期せぬ結果をもたらす可能性があるため、十分に注意してください。

それでは、実際に数字と文字列を結合してみましょう。

let age: number = 30;
let ageString: string = "歳";
let ageResult: string = age + ageString;
console.log(ageResult);

このコードを実行すると、”30歳”という結果が得られます。

ここでは、数値の「age」が文字列に変換され、結果として”30″という文字列が生成されています。

この後、”歳”という文字列と結合され、期待通りの”30歳”という文字列が得られることが確認できます。

○サンプルコード8:ビット演算子の活用

ビット演算子は、TypeScriptでもJavaScriptでも、整数の二進表現に対して行われる操作を表す演算子です。

ビット演算子を利用することで、計算の高速化やメモリの効率的な使用など、さまざまなメリットがあります。

今回はビット演算子の基本的な活用方法をサンプルコードと共に詳しく解説します。

さらにそのコードの実行結果も、実行後のコードと共に解説していきます。

まずは、ビット演算子の種類とそれぞれの特性を理解しましょう。

ビット演算子には、AND(&)、OR(|)、XOR(^)、NOT(~)、左シフト(<<)、右シフト(>>)、無符号右シフト(>>>)があります。

次に、実際のサンプルコードとその詳細な説明を見ていきます。

let a: number = 5; // 0101 in binary
let b: number = 3; // 0011 in binary

let result: number = a & b; 
console.log(result); // 1 (0001 in binary)

このコードでは5と3のAND演算を行っています。

5は二進数で0101、3は0011と表されます。AND演算は両方のビットが1のときだけ1を返し、それ以外は0を返します。

したがって、このコードを実行すると、0101と0011のAND演算の結果、0001(十進数で1)が得られます。

続いて、他のビット演算子の使用例も確認しましょう。

let c: number = 5; // 0101 in binary
let d: number = 3; // 0011 in binary

let result2: number = c | d; 
console.log(result2); // 7 (0111 in binary)

このコードではOR演算を行っています。OR演算はどちらかのビットが1であれば1を返し、両方が0の場合は0を返します。

したがって、このコードを実行すると、0101と0011のOR演算の結果、0111(十進数で7)が得られます。

○サンプルコード9:型の互換性チェック

型の互換性チェックは、TypeScriptで非常に重要な作業の一つとなります。

ここでは、型の互換性を確認する際の基本的なステップと、サンプルコードを交えた詳細な解説を行います。

TypeScriptは静的型付け言語であるため、型の互換性チェックは必須のステップとなります。

これは、コードが安全かつ予期せぬエラーが発生しないようにするために行います。

例えば、ある関数が特定の型の引数を期待している場合、その期待に沿った型の引数が渡されることを保証するために型チェックを行います。

下記のコードは、型の互換性をチェックする基本的な例です。

interface Person {
  name: string;
  age: number;
}

function greet(person: Person) {
  return `Hello, my name is ${person.name} and I am ${person.age} years old.`;
}

const john: Person = { name: 'John', age: 30 };
const jane: any = { name: 'Jane', age: 'thirty' };

console.log(greet(john)); // 正常なケース
console.log(greet(jane)); // 型の互換性がないケース

このコードでは、Personインターフェースを使って、name属性が文字列型、age属性が数値型であることを定義しています。

そして、greet関数はこのPerson型のオブジェクトを期待しています。

johnオブジェクトはこの期待を満たすが、janeオブジェクトはage属性が文字列となっているため、互換性がありません。

●注意点と対処法

TypeScriptで二項演算子を利用する際には、いくつかの注意点があります。以下で、それらの注意点と、それに対応する対処法について解説します。

まず最初に、型の不整合によるエラーが発生する可能性があることを覚えておく必要があります。これは、TypeScriptが型安全言語であるため、異なる型間での不適切な操作を行うとエラーが出るという性質があるためです。具体的な注意点と対処法は次の通りです。

○型の不整合によるエラー

TypeScriptでよく遭遇する問題の1つが、型の不整合によるエラーです。

例えば、文字列と数値を直接結合しようとした場合、TypeScriptはこれを型エラーとして捉え、コンパイルエラーを発生させます。

対処法としては、明示的な型変換を行うか、型アサーションを使用することが挙げられます。

型アサーションは、特定の式が想定した型であるとTypeScriptに伝える方法です。

ここで、型アサーションを用いたサンプルコードとその解説を提供します。

○サンプルコード10:型アサーションを用いた対処法

let str: string = "年齢は";
let age: number = 30;

// 型アサーションを使用して、数値を文字列に変換
let message: string = str + age.toString();

console.log(message);

このコードでは、変数strとageを宣言し、ageは数値型として宣言されています。

strとageを結合する際に、.toString()メソッドを用いて数値を文字列に変換し、型の不整合エラーを避けることができます。

このコードを実行すると、コンソールに「年齢は30」という文字列が出力されます。

このように、型アサーションや明示的な型変換を使用することで、型の不整合エラーを解消することが可能です。

また、型アサーションを用いる別の方法として、次のようなコードもあります。

let message: string = str + (age as number);

このコードでは「as」キーワードを使って、age変数を数値として扱うことを表しています。

しかし、この場合はageが初めから数値型であるため、特に変換は必要ありません。

●カスタマイズ方法

TypeScriptでのプログラム開発において、二項演算子は基本的な要素の一つとなります。

しかし、時には標準の二項演算子だけでは不足であり、カスタム型や関数を使用して演算子の挙動をカスタマイズすることが必要となります。

ここでは、カスタム型を作成し、それを用いた二項演算子の拡張方法をサンプルコードとともに詳しく解説します。

○サンプルコード11:カスタム型を用いた二項演算子の拡張

まずは、カスタム型を定義します。

ここではCustomTypeという名前の型を定義し、その型に特定のプロパティを持たせることにします。

class CustomType {
  constructor(public value: number) {}

  // このコードでは「plus」メソッドを使って、オブジェクト同士の加算を行います。
  plus(other: CustomType): CustomType {
    return new CustomType(this.value + other.value);
  }
}

次に、カスタム型を利用して二項演算子のような動作を実現します。

カスタムメソッドplusを使って、二つのCustomTypeオブジェクトを加算します。

const a = new CustomType(5);
const b = new CustomType(3);

// このコードを実行すると、新しいCustomTypeオブジェクトが生成され、そのvalueプロパティが8になった結果、表示されます。
const result = a.plus(b);
console.log(result.value);  // 出力: 8

上記のコードを実行すると、コンソールには「8」と表示されます。

このように、カスタム型を使用して独自の「二項演算子」を作成し、その動作をカスタマイズすることができます。

○サンプルコード12:関数オーバーロードを使った柔軟な操作

関数オーバーロードとは、プログラム言語において、同じ関数名を持つが異なる引数のリストを持つ複数の関数を定義できる機能を指します。

この機能を利用することで、異なる引数に応じて異なる動作を行う関数を一つの関数名でまとめることができます。

ここでは、TypeScriptでの関数オーバーロードの基本的な使い方と、その応用に関するサンプルコードを紹介します。

まずは基本的な関数オーバーロードの構造を紹介します。

下記のサンプルコードは、関数オーバーロードを利用して、数値または文字列を受け取り、それぞれ異なる処理を行う関数を表しています。

function flexibleOperation(x: number): number;
function flexibleOperation(x: string): string;

function flexibleOperation(x: number | string): number | string {
    if (typeof x === 'number') {
        return x * x;
    } else {
        return x.toUpperCase();
    }
}

console.log(flexibleOperation(5)); // このコードを実行すると、25が出力されます。
console.log(flexibleOperation('hello')); // このコードを実行すると、HELLOが出力されます。

このコードでは、flexibleOperationという名前の関数をオーバーロードしています。

まず、関数のシグネチャ(引数の型と戻り値の型を示す部分)を二つ定義します。

一つは数値を受け取り、数値を返すシグネチャ、もう一つは文字列を受け取り、文字列を返すシグネチャです。

次に、実際の関数の実装を提供します。この実装は、数値または文字列のどちらかを受け取り、条件分岐を使用して引数の型を確認し、適切な処理を行います。

ここで、typeof x === 'number'という条件を使用して引数の型を確認しています。

この条件が真であれば、数値を受け取ったと解釈し、その数値の平方を返します。

それ以外の場合、つまり文字列を受け取った場合、その文字列を大文字に変換して返します。

このサンプルコードを実行すると、まず、数値5を引数として関数を呼び出すと、25が返されます。

これは5の平方であることから、数値の処理が正しく行われたことがわかります。

次に、文字列’hello’を引数として関数を呼び出すと、’HELLO’が返されます。

これにより、文字列の処理も正しく行われたことが確認できます。

まとめ

TypeScriptの二項演算子はプログラムの多岐にわたる部分で活用され、効率的かつ直感的なコードの記述を可能とします。

本記事では、その基本的な用途から応用例まで、多くの視点からその使用法を詳しく解説しました。

今回理解した内容を糧に、これからもTypeScriptの探求を続け、さらなる知識と技術を習得していきましょう。

この記事が、その第一歩として役立つことを期待しています。

ご覧いただきありがとうございました。