1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
コース一覧
TypeScript道場 fleama開発室の10問
関数に正しい型を付けよ

TypeScript道場 fleama開発室の10問

TypeScript入門で身に付けた技を、商店街公式フリマアプリ「fleama」開発室の仕事で試す演習専用コースです。解説はありません。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。判定はコンパイラそのものです。型が通らないコードは実行される前に不合格になるので、まず tsc を黙らせてから中身を合わせることになります。基本型の注釈から始まり、関数の署名、any の撲滅、interface の設計、リテラルunion、型ガード、ジェネリクス、入口での変換、入れ子のAPIレスポンスを経て、最後は型のないモジュールを strict で通る形に組み直すところまで、10問で TypeScript の主要な道具を一巡します。1問10分から45分、全10問で約4.5時間です。TypeScript入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
初段
01. 赤い波線を消せ10分
02. 関数に正しい型を付けよ15分
03. このanyを撲滅せよ15分
04. Item型を設計せよ20分
2
中段
01. 不正な状態を型で封じよ25分
02. 型ガードで絞り込め25分
03. 汎用関数に型を付けよ30分
04. 型を付けて事故を防げ30分
3
師範
01. APIレスポンスに型を通せ35分
02. 総合 型のないモジュールを完全TS化45分

関数に正しい型を付けよ

初段 / 目安 15分

翌日、凛さんが1つのファイルを開いて待っていました。fleama の手数料計算です。

「この関数、入出力の型がありません。何を受けて何を返すのか、署名で語ってください」

署名というのは、関数の名前と、引数の型と、戻り値の型を並べた1行のことです。calcFee(price: number): number と書いてあれば、この関数は数値を1つ受け取って数値を1つ返すのだと、中身を1行も読まずに分かります。凛さんが求めているのはそれです。

TypeScript では、引数の型注釈は引数名のうしろに書きます。戻り値の型注釈は、閉じ括弧のうしろに書きます。書く場所さえ覚えてしまえば、あとは第一問と同じ string number boolean の世界です。

戻り値の型を書くことには、地味ですが大きな効きめがあります。うっかり文字列を返してしまったとき、その場で tsc が止めてくれるからです。戻り値の型を書かない関数は、返し忘れや返し間違いを、呼び出した側まで運んでいってしまいます。間違いは、生まれた場所で捕まえるのがいちばん安いのです。

fleama の手数料は次のように決まっています。販売価格の10パーセントです。ただし1円未満は切り捨てます。そして手数料の下限は50円です。計算結果が50円を下回った場合は50円になります。

完成条件

販売価格を受け取り、手数料を返す関数 calcFee を作ってください。

  • 手数料は販売価格の10パーセント
  • 1円未満は切り捨てること
  • 計算結果が50未満のときは50を返すこと
  • 引数と戻り値の両方に型注釈を付けること

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

切り捨てには Math.floor が使えます。Math.floor は数値を受け取って数値を返すので、戻り値の型と喧嘩しません。

要件

  1. 関数名は calcFee、引数は販売価格の1つ
  2. 引数に型注釈を付けること。販売価格は数値
  3. 戻り値にも型注釈を付けること。閉じ括弧のうしろに書く
  4. 手数料は販売価格の10パーセントで、1円未満は切り捨てること
  5. 計算結果が50未満のときは50を返すこと

入出力例

calcFee(3000) → 300 calcFee(1000) → 100 calcFee(500) → 50 calcFee(499) → 50 calcFee(120) → 50 calcFee(0) → 50 calcFee(12345) → 1234

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 先に10パーセントを求めて切り捨て、そのあとで50と比べます。順番を逆にすると、切り捨ての結果が下限を下回ったときに拾えません

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • このanyを撲滅せよ

    散らばった any を消します。推論に任せられる箇所は、あえて書かないことも腕前のうちです。

  • Item型を設計せよ

    出品データの形を interface として宣言します。省略可能と書き換え不可を、記号で表し分けます。

  • 不正な状態を型で封じよ

    商品状態を3つのリテラルの union にし、それ以外が存在できない世界にします。typo が実行前に死にます。

  • APIレスポンスに型を通せ

    入れ子になったAPIレスポンスを、as を使わずに型の入れ子で表します。通信の向こう側まで型を届かせます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 関数処理に名前を付けて再利用できる単位
  • 入出力input()はユーザーからの入力を文字列として受け取る関数。
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
  • TypeScript静的型を加えた JavaScript の上位互換
  • 型注釈変数や引数に : 型 で宣言する書式
main.ts
学習モード
エディタを読み込んでいます

メモ

関数に正しい型を付けよ

⌘S で保存