見出し画像

基礎からのTypeScript[関数]

外資系企業でソフトウェアエンジニアをしております、タロイモと言います。今日もよろしくお願いします。

前回からTypeScriptの文法について解説しています。
今回は第二回として関数を説明していきます。

環境構築をはじめに書きますが、すでに構築済みの方は飛ばしてください。

0. 環境構築

TypeScriptのエディタ
Visual Stadio Codeを使用します。TypeScriptと同様にMicroSoft開発であるため使用しますが、基本的にどのエディタでも対応しています。

TypeScriptコンパイラ
Macだとターミナル、Windowsだとコマンドプロンプトを開き、以下コマンドを実行し、インストールします。
npm(Node.js)のインストール方法は割愛します。

npm install -g typescript
-gオプションはグローバルインストール(PC自体へのインストール)を行うため、npmの前にsudoをつけないと実行できない場合があります。

1. 関数の書き方

基本的にTypeScriptはJavaScriptと同じ書き方が行えます。

関数宣言(function statement)
引数と返り値のデータ型を定めること以外はJavaScriptと同じです。

function 関数名(引数: 引数のデータ型): 返り値のデータ型{
    return 返り値;
}
function sum(height: number, width: number): string{
    let square: number = height * width;
    return `面積は${square}です。`;
}
console.log(sum(2, 5)); //面積は10です。

関数リテラル(function literal)
変数に返り値のデータ型を指定するのではない点に注意してください。

let 変数名 = function(引数: 引数のデータ型): 返り値のデータ型{
    return 返り値;
}
let sum = function(height: number, width: number): string{
    let square: number = height * width;
    return `面積は${square}です。`;
}
console.log(sum(2, 5)); //面積は10です。

アロー関数(Arrow function expression)
基本的には関数リテラルをシンプルにしたものと考えて良いです。
※ただし、JavaScriptと同様にthisを固定する点で関数リテラルと違うことに注意です。参考

//returnなし
let 変数名 = (引数: データ型): 返り値のデータ型 => 返り値;

//returnあり
let 変数名 = (引数: データ型): 返り値のデータ型 => {
 return 返り値;
}
let sum = (height: number, width: number): string => {
    let square: number = height * width;
    return `面積は${square}です。`;
}
console.log(sum(2, 5)); //面積は10です。


2. 関数固有のデータ型

void型
Javaでお馴染みのvoid型も使うことができます。
void型は、返り値を返さない(returnしない)関数ということを明示するために使います。

function sum(height: number, width: number): void{
    let square: number = height * width;
    console.log(`面積は${square}です。`);
}
sum(2, 5); //面積は10です。

never型
void型と区別しづらいのがnever型です。
voidは、何もreturnしない場合に使います。
neverは、returnをしません。何もreturnしないのではなくreturn自体をしない(辿り着けない)のです。

never型は以下の状況で使います。
・実行されるreturn文が存在しない時(無限ループ時など)
・常にエラーをthrowする関数 

わかりづらいので例を示します。

//無限ループ
function hoge(): never {
    while(true){
        //returnなし
    }
}

//エラーをthrowする
let hoge: never = (() => { throw new Error(`エラーです`) })(); 

また、neverにはnever型以外の数字を入れることができません。

let hoge: never = 123; //エラー
let hoge: never = "ホゲホゲ"; //エラー


3. 引数をうまく扱う方法

オプション(任意)引数
引数を省略した場合にも、正しく実行されるようにできます。

function 関数名(引数?: 引数のデータ型): 返り値のデータ型{
    return 返り値;
}
let sum = (height?: number, width?: number): string => {
    if (height === undefined) {
        return "引数が必要です";
    } else {
        let square: number = height * width;
        return `面積は${square}です。`;
    }
}
sum(2, 5); //面積は10です。
sum(); //引数が必要です。

デフォルト(既定)引数
引数を省略した場合に、初期値を指定することもできます。

function 関数名(引数: 引数のデータ型 = 初期値): 返り値のデータ型{
    return 返り値;
}
let sum = (height: number = 2, width: number = 5): string => {
    if (height === undefined) {
        return "引数が必要です";
    } else {
        let square: number = height * width;
        return `面積は${square}です。`;
    }
}
sum(2, 5); //面積は10です。
sum(); //面積は10です。

レスト(残余)引数
引数を配列として扱ってくれるのが、レスト引数です。
引数の前に"..."を書きます。

function 関数名(...引数: 引数のデータ型): 返り値のデータ型{
    return 返り値;
}
let sum = (...args: number[]): string => {
    let result = 0;
    for (let arg : args) {
        result += arg;
    }
    return `合計は${result}です。`;
}
sum(2, 5); //合計は7です。


4. まとめ

今回はTypeScriptの関数を扱いました。

量は多くなりましたが、
JavaScriptと大きく変わる点はほとんどありません。

他にもJavaなどでお馴染みのオーバーロードなども紹介したかったのですが、TypeScriptでは未完成な機能だなと思ったので割愛しました。
興味がある方は調べてみてください。

本日もご精読ありがとうございました。



よろしければサポートお願いします! サポートは、サービスの開発・改良や、記事を書く際の素材費とさせていただきます。 少しでも有益な情報発信をしていけるよう努めてまいります。 是非とも応援よろしくお願いします!!!🙇‍♂️