TypeScript 入門日記 04

前回

blog.takunology.jp

今回やったもの

docs.microsoft.com

名前付き関数

関数を作るときは function キーワードを使用する。これは他の言語でも同じような形式で、何度か使用したこともあるので大丈夫そう。

function addNumbers (x: number, y: number): number {
   return x + y;
}
addNumbers(1, 2);

匿名関数

関数名のない関数で、直接中身を実装することができる。C# でいうところの Func<T> 的なやつかな。

let addNumbers = function (x: number, y: number): number {
   return x + y;
}
addNumbers(1, 2);

アロー関数

匿名関数を定義しなくても、そのまま略式形式で処理を書くことができる。これはラムダ式と一緒。

// 匿名関数
let addNumbers1 = function (x: number, y: number): number {
   return x + y;
}

// アロー関数(ラムダ式)
let addNumbers2 = (x: number, y: number): number => x + y;

合計値を求める関数

関数の練習として。

function sum(input: number[]): number {
    let total: number = 0;
    for (let count = 0; count < input.length; count++) {
        if(isNaN(input[count])){
            continue;
        }
        total += Number(input[count])
    }
    return total;
}

let myNum: Array<number> = [1, 2, 3, 4, 5];

console.log(sum(myNum));

パラメータ

インターフェイスだけでなく関数にもパラメータを指定することができる。要は ? で任意パラメータにしたり、代入演算子で予め値を入れておくことができる。

// 必須パラメータ
function addNumbers (x: number, y: number): number {
   return x + y;
}

// 省略可能パラメータ
function addNumbers (x: number, y?: number): number {
    if (y === undefined) {
        return x;
    } else {
        return x + y;
    }
}

// 既定値を持つパラメータ
function addNumbers (x: number, y = 25): number {
   return x + y;
}

rest (... 演算子) を使うと複数のパラメータを1つの配列として受け取る事もできるらしい。

let addAllNumbers = (firstNumber: number, ...restOfNumbers: number[]): number => {
   let total: number =  firstNumber;
   for(let counter = 0; counter < restOfNumbers.length; counter++) {
      if(isNaN(restOfNumbers[counter])){
         continue;
      }
      total += Number(restOfNumbers[counter]);
   }
   return total;
}

このようにすると、関数の引数に複数の値を代入して利用することができる。また、「分解オブジェクト」というものをパラメータにすることができるみたい。インターフェイスを引数にして、実引数にオブジェクトパラメータを入れて使う。

interface Message {
   text: string;
   sender: string;
}

function displayMessage({text, sender}: Message) {
    console.log(`Message from ${sender}: ${text}`);
}

displayMessage({sender: 'Christopher', text: 'hello, world'});

演習1

とりあえず MS Learn の演習をやってみる。

// 必須パラメータ
let addThreeNumbers = (x: number, y: number, z: number): number => x + y + z;
console.log(addThreeNumbers(1, 2, 3));

// 省略可能パラメータ
let addThreeNumbers2 = (x: number, y: number, z?: number): number => {
    if(z === undefined) {
        return x + y;
    }
    return x + y + z;
}
console.log(addThreeNumbers2(4, 5, 6));

// 既定のパラメータ
let substractThreeNumbers = (x: number, y: number, z: number = 64): number => x - y- z;
console.log(substractThreeNumbers(256, 128));

これで三種類のパラメータを利用した関数の定義ができるようになったかも?

演習2

次は関数を宣言するやつ。関数の型を予め決めておいて、用途に合わせて機能(処理)を変更できる。

// 関数型を定義 type 版
// type calculator = (x: number, y: number) => number;
// インターフェイス版
interface calculator {
    (x: number, y: number): number;
} 

// 関数型から関数を作る
let addNumbers: calculator = (x: number, y: number): number => x + y;
let substractNumbers: calculator = (x: number, y: number): number => x - y;

console.log(addNumbers(1, 2));
console.log(substractNumbers(1, 2));

// 関数から別の関数を呼び出す
let doCalculation = (operation: "add" | "sub"): calculator => {
    if (operation === "add") {
        return addNumbers;
    } else {
        return substractNumbers;
    }
}

console.log(doCalculation("add")(1, 2));
console.log(doCalculation("sub")(1, 2));

ちなみに、関数パラメータ名はなんでもいい。

課題

最後に MS Learn の課題問題をやって終了。

function buildArray(items: number, sortOrder: "ascending" | "descending"): number[] {
    let randomNumbers: number[] = [];
    let nextNumber: number;

    for (let counter = 0; counter < items; counter++) {
        nextNumber = Math.ceil(Math.random() * (100 - 1));
        if (randomNumbers.indexOf(nextNumber) === -1) {
            randomNumbers.push(nextNumber);
        } else {
            counter --;
        }
    }
    console.log("before: " + randomNumbers);

    if (sortOrder === "ascending") {
        return randomNumbers.sort(sortAscending);
    } else {
        return randomNumbers.sort(sortDescending);
    }
}

type compareFunctionType = (a: number, b: number) => number;

let sortDescending: compareFunctionType = (a, b) => {
    if (a > b) {
        return -1;
    } else if (b > a) {
        return 1;
    } else {
        return 0;
    }
}

let sortAscending: compareFunctionType = (a, b) => {
    if (a > b) {
        return 1;
    } else if (b > a) {
        return -1;
    } else {
        return 0;
    }
}

let myArray1 = buildArray(10, "ascending");
console.log("after: " + myArray1 + "\n");
let myArray2 = buildArray(10, "descending");
console.log("after: " + myArray2);

実行結果

before: 22,43,98,73,53,35,9,15,21,31
after: 9,15,21,22,31,35,43,53,73,98

before: 69,18,34,92,47,12,1,29,46,5
after: 92,69,47,46,34,29,18,12,5,1

適当な配列を昇順と降順でソートするプログラムができた。

イベントのお知らせ

2022年4月24日(日)に MS Tech Camp #14 を開催します。今回は私「たくのろじぃ」主催で、Blazor を使ったポートフォリオサイト製作と Azure Static Web Apps へのデプロイをやります。
興味がある方は(社会人、学生問わず)ぜひご参加ください!
Youtube での配信ですので、休日はごろごろしながらご覧いただければと思います。もちろん、一緒にやっていただいても結構です!

mspjp.connpass.com