WEBVTT

1
00:00:00.000 --> 00:00:01.100
こんにちは。

2
00:00:01.100 --> 00:00:05.134
タイプスクリプト入門、第五回は関数の型です。

3
00:00:05.134 --> 00:00:10.819
前回はインターフェースとタイプでオブジェクトの形を学びました。

4
00:00:10.819 --> 00:00:17.054
今回は、関数が受け取る引数と、返す戻り値に型を付ける方法を学びます。

5
00:00:17.054 --> 00:00:24.022
引数と戻り値の型が分かれば、関数の使い方は名前と型を見るだけで判断できます。

6
00:00:24.022 --> 00:00:30.073
さらに、関数そのものを表す関数型、省略できる引数、個数が決まらない引数、

7
00:00:30.073 --> 00:00:36.125
そして呼び出し方を複数表すオーバーロードまで順に確認します。

8
00:00:36.125 --> 00:00:43.093
この回を終えるころには、関数を安全に定義し、正しく呼び出せるようになります。

9
00:00:43.093 --> 00:00:45.660
関数はプログラムの部品です。

10
00:00:45.660 --> 00:00:55.012
その部品の入り口と出口に型という説明書が付いていれば、使う側は中身を読まなくても安心して呼び出せます。

11
00:00:55.012 --> 00:00:56.215
まず基本です。

12
00:00:56.215 --> 00:01:01.887
引数の型は引数名の後ろに、戻り値の型は引数リストの後ろに書きます。

13
00:01:01.887 --> 00:01:07.732
たとえば二つの数値を受け取り数値を返す関数は、そのまま型で表せます。

14
00:01:07.732 --> 00:01:10.138
戻り値の型は省略もできます。

15
00:01:10.138 --> 00:01:15.467
数値同士のかけ算なら、戻り値はナンバーだと推論されるからです。

16
00:01:15.467 --> 00:01:24.061
ただし、戻り値を明記すると関数の契約が読み取りやすくなり、返す値をうっかり変えたときにも気づけます。

17
00:01:24.061 --> 00:01:33.171
一方、メッセージを表示するだけの関数の戻り値はボイドと書き、呼び出し側が結果の値を使わないことを表します。

18
00:01:33.171 --> 00:01:37.640
推論に任せる場面と、明記する場面を使い分けましょう。

19
00:01:37.640 --> 00:01:43.318
関数を変数や引数として扱う場合は、関数そのものの型を書けます。

20
00:01:43.318 --> 00:01:49.729
引数リストと矢印を使って、受け取る値と返す値をまとめて表す書き方です。

21
00:01:49.729 --> 00:01:56.506
たとえば、数値二つを受け取り数値を返す計算、という関数型に名前を付けます。

22
00:01:56.506 --> 00:02:01.360
引き算の関数をその型で宣言すると、引数の型は代入先の関数型から推論されるため、

23
00:02:01.360 --> 00:02:06.213
改めて書く必要はありません。

24
00:02:06.213 --> 00:02:11.708
計算方法を受け取る関数は、その関数型を引数の型に指定します。

25
00:02:11.708 --> 00:02:19.218
関数型を使うと、コールバックがどんな値を受け取り、何を返すのかを一か所で示せます。

26
00:02:19.218 --> 00:02:25.079
この考え方は、処理の一部だけを差し替えたい場面で特に役立ちます。

27
00:02:25.079 --> 00:02:32.772
差し替える関数が守るべき形が型で決まっているため、違う形の関数を渡すミスを防げます。

28
00:02:32.772 --> 00:02:39.293
引数名の後ろにクエスチョンマークを付けると、その引数は省略できるようになります。

29
00:02:39.293 --> 00:02:41.902
これをオプション引数と呼びます。

30
00:02:41.902 --> 00:02:47.282
省略された場合、関数の中ではその値はアンディファインドになります。

31
00:02:47.282 --> 00:02:52.173
そのため、使う前に値があるかどうかを確認する必要があります。

32
00:02:52.173 --> 00:02:55.433
ここで注意したいのが、ゼロとの区別です。

33
00:02:55.433 --> 00:03:02.118
値があるかどうかをざっくり判定すると、ゼロも未指定と同じように扱われてしまいます。

34
00:03:02.118 --> 00:03:10.758
省略されたのか、ゼロが渡されたのかを区別したいときは、アンディファインドと等しいかどうかで確認しましょう。

35
00:03:10.758 --> 00:03:15.160
小さな違いですが、件数のような値では結果が変わります。

36
00:03:15.160 --> 00:03:21.549
デフォルト引数は、引数を省略したときに使う既定値をあらかじめ用意する仕組みです。

37
00:03:21.549 --> 00:03:30.174
たとえば、メッセージを繰り返す回数の既定値を一回としておけば、回数を指定しない呼び出しでもそのまま動きます。

38
00:03:30.174 --> 00:03:35.445
既定値から型は推論されるため、回数の型を別に書く必要はありません。

39
00:03:35.445 --> 00:03:41.834
既定値が使われるのは、引数を省略した場合と、アンディファインドを渡した場合です。

40
00:03:41.834 --> 00:03:48.064
ヌルやゼロを渡した場合は、その値がそのまま使われ、既定値には置き換わりません。

41
00:03:48.064 --> 00:03:54.932
また、回数のような値は、負の数や小数でないかを実行時に検証すると、より安全になります。

42
00:03:54.932 --> 00:03:59.738
渡される値の個数が決まっていない場合は、残余引数を使います。

43
00:03:59.738 --> 00:04:04.063
引数名の前にドットを三つ書き、型には配列を指定します。

44
00:04:04.063 --> 00:04:09.510
呼び出しで渡された値は、すべて一つの配列としてまとめて受け取れます。

45
00:04:09.510 --> 00:04:14.797
たとえば合計を求める関数は、ゼロ個から何個でも数値を受け取れます。

46
00:04:14.797 --> 00:04:18.962
一つも渡されなければ空の配列になり、合計はゼロです。

47
00:04:18.962 --> 00:04:23.127
二つ渡せばその合計、六つでも同じ処理で対応できます。

48
00:04:23.127 --> 00:04:26.651
残余引数は引数リストの最後に置く決まりです。

49
00:04:26.651 --> 00:04:31.297
可変長の入力を、配列の処理として素直に書けるのが利点です。

50
00:04:31.297 --> 00:04:36.904
合計を求める処理自体は、配列に対する繰り返し処理として書かれています。

51
00:04:36.904 --> 00:04:43.152
引数の個数が変わっても、受け取った後の処理は一つで済むのが分かりやすい点です。

52
00:04:43.152 --> 00:04:48.635
オーバーロードは、一つの関数に複数の呼び出し方を型で表す仕組みです。

53
00:04:48.635 --> 00:04:55.730
書き方は、まず呼び出し方の型だけを上に並べ、その下に実際の処理を持つ実装を一つ書きます。

54
00:04:55.730 --> 00:05:01.374
たとえば、文字列を渡せば文字列が返り、数値を渡せば数値が返る関数です。

55
00:05:01.374 --> 00:05:07.502
文字列なら二つつなげ、数値なら二倍にする、といった分岐は実装の中に書きます。

56
00:05:07.502 --> 00:05:12.823
呼び出し側は、渡した引数の型に応じて戻り値の型も正確に分かります。

57
00:05:12.823 --> 00:05:16.693
文字列の戻り値には文字列のメソッドが、数値の戻り値には数値のメソッドが、

58
00:05:16.693 --> 00:05:20.563
そのまま安全に使えます。

59
00:05:20.563 --> 00:05:26.046
つまり、呼び出し側に見せる顔が複数あり、実体は一つ、という構造です。

60
00:05:26.046 --> 00:05:32.980
型の世界では別々の関数に見えても、実行される処理は共通であることを覚えておきましょう。

61
00:05:32.980 --> 00:05:36.257
オーバーロードには大切な注意点があります。

62
00:05:36.257 --> 00:05:41.563
タイプスクリプトが実行時に別々の関数を自動で選ぶわけではありません。

63
00:05:41.563 --> 00:05:48.430
コンパイル後のジャバスクリプトに残るのは実装だけであり、分岐は自分で書く必要があります。

64
00:05:48.430 --> 00:05:53.424
また、呼び出し側から使えるのは、上に宣言したシグネチャだけです。

65
00:05:53.424 --> 00:05:58.574
実装が文字列か数値のユニオン型を受け取れても、そのユニオン型の変数をそのまま渡す呼び出し方は、

66
00:05:58.574 --> 00:06:03.724
宣言されていなければエラーになります。

67
00:06:03.724 --> 00:06:11.215
さらに、入力と出力の対応が変わらないなら、ユニオン型の引数を持つ関数一つで十分な場合もあります。

68
00:06:11.215 --> 00:06:13.712
増やす前に必要性を考えましょう。

69
00:06:13.712 --> 00:06:17.013
書いた例は、実際にコンパイルして確かめましょう。

70
00:06:17.013 --> 00:06:24.028
最初の例のファイルを指定し、ストリクトを有効にしてコンパイルすると、型の誤りがあればそこで止まります。

71
00:06:24.028 --> 00:06:27.605
エラーがあれば出力しないオプションも付けておきます。

72
00:06:27.605 --> 00:06:32.556
コンパイルが成功したら、生成されたジャバスクリプトをノードで実行します。

73
00:06:32.556 --> 00:06:37.921
合計は七、積は十二と表示されれば、型チェックと実行結果の両方が期待どおりです。

74
00:06:37.921 --> 00:06:43.148
他の節の例も、入力と出力のファイル名を対応させれば、同じ手順で確認できます。

75
00:06:43.148 --> 00:06:47.412
型が通ることと、結果が合うこと、その両方を見る習慣が大切です。

76
00:06:47.412 --> 00:06:50.253
最後に、実務での判断基準を整理します。

77
00:06:50.253 --> 00:06:54.441
複数ファイルから使う公開的な関数では、引数と戻り値を読めば使い方が分かるように、

78
00:06:54.441 --> 00:06:58.628
型を明記して契約を示しましょう。

79
00:06:58.628 --> 00:07:05.208
一方、内部だけで使う短いコールバックは、型推論に任せると同じ説明を繰り返さずに済みます。

80
00:07:05.208 --> 00:07:11.190
オーバーロードについては、呼び出し形式を増やすほど実装の分岐やテストも増えます。

81
00:07:11.190 --> 00:07:17.472
利用側にどの型情報が必要かを先に決め、ユニオン型で足りる場合はそちらを選びましょう。

82
00:07:17.472 --> 00:07:22.855
そして、外部から取得したデータには、型注釈だけでなく値の検証も必要です。

83
00:07:22.855 --> 00:07:26.594
この線引きが、読みやすく安全な関数につながります。

84
00:07:26.594 --> 00:07:32.576
型を書く目的は、チェックを増やすこと自体ではなく、使う側の迷いを減らすことです。

85
00:07:32.576 --> 00:07:37.960
どこまで明記すれば読み手が助かるか、という視点で判断するとよいでしょう。

86
00:07:37.960 --> 00:07:38.916
まとめです。

87
00:07:38.916 --> 00:07:46.723
関数の引数には受け取る値の型を、戻り値には返す値の型を指定し、値を返さない関数はボイドで表します。

88
00:07:46.723 --> 00:07:52.300
関数型を使えば、関数そのものやコールバックの入出力もまとめて表せます。

89
00:07:52.300 --> 00:07:57.796
省略できる引数はクエスチョンマーク、既定値はイコール、個数が決まらない引数は残余引数で表し、

90
00:07:57.796 --> 00:08:03.293
それぞれ省略された場合の扱いを意識しましょう。

91
00:08:03.293 --> 00:08:09.188
オーバーロードは複数の呼び出し方と一つの実装で表しますが、実行時に自動で選ばれる仕組みではなく、

92
00:08:09.188 --> 00:08:15.084
ユニオン型で足りる場合も多い点を忘れないでください。

93
00:08:15.084 --> 00:08:19.226
次回は第六回として、ユニオン型と型ガードを学びます。

94
00:08:19.226 --> 00:08:20.660
お疲れさまでした。
