関数のTS化

次はユーティリティ関数

データ層が終わったので、次はそれを加工する関数群です。整形したり数えたりする小さな関数が集まったファイルで、画面のことは知りません。

ここでやることも同じです。引数に型を付ける、外へ出す値に型を付ける、出たエラーを読む、の順です。

変数に入れた関数には関数型を書く

ユーティリティのファイルには、アロー関数を変数に入れた書き方がよく出てきます。

const withBrackets = (title) => "「" + title + "」";

これを移すと、引数の titleany になってエラーです。書き方は 2 通りあります。

// 引数と戻り値に直接付ける const withBrackets = (title: string): string => "「" + title + "」"; // 変数のほうに関数型を付ける type Formatter = (title: string) => string; const withBrackets: Formatter = (title) => "「" + title + "」";

下の書き方だと、アロー関数の中に型を書かなくても titlestring だと分かります。変数の型から中身へ型が流れているからです。同じ形の関数がいくつも並ぶファイルでは、こちらのほうが短くなります。

配列メソッドは型が勝手に付いてくる

第3章で見たとおり、mapfilter に渡すコールバックの引数には型を書きません。

const titles: string[] = ["プロフィールサイト", "自己紹介カード"]; const decorated = titles.map(withBrackets); // decorated は string[]

titlesstring[] なので、map は「string を受け取る関数」しか受け付けません。関数の側を先に型付けしておくと、こういう組み合わせの間違いも止まります。

const counts: number[] = [1, 2, 3]; counts.map(withBrackets); // エラー Argument of type 'Formatter' is not assignable to ...

数え間違いは型では止まらない

注意しておきたいのは、型が守るのは形だけだ、ということです。

function restCount(titles: string[], max: number): number { return titles.length - max; }

この関数は、max のほうが大きいとマイナスを返します。型としては何も間違っていないので、tsc は黙っています。

移行のときは、型エラーが消えた時点で終わりにしないでください。型が消してくれるのは打ち間違いと形の不一致で、数の扱いは自分で確かめる必要があります。

手を動かす

演習では、作品タイトルの一覧を表示用の一行に整える関数を移行します。アロー関数のほうにも型が要ることに注意してください。件数がはみ出したときの扱いも、自分で確かめながら書きます。

要件

  1. withBrackets の引数に型を付ける
  2. formatWorkList の引数と戻り値に型を付ける
  3. 並べるタイトルはかぎカッコで囲み、読点でつなぐ
  4. max を超えた分だけ ほかN件 を末尾に足す
  5. 処理の中身は変えない

入出力例

formatWorkList(["プロフィールサイト","自己紹介カード","スキル一覧の表"], 2)"「プロフィールサイト」、「自己紹介カード」ほか1件" formatWorkList(["プロフィールサイト"], 2)"「プロフィールサイト」" formatWorkList(["プロフィールサイト","自己紹介カード"], 2)"「プロフィールサイト」、「自己紹介カード」" formatWorkList([], 2)"" formatWorkList(["プロフィールサイト","自己紹介カード","スキル一覧の表"], 1)"「プロフィールサイト」ほか2件"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.ts
main.ts
学習モード

メモ

関数のTS化

⌘S で保存