# Okachi.js#38 4章1節「関数の宣言と呼び出し」 ## 近況報告・小ネタ? - pyhack-camp - ADをしてました [twitter](https://twitter.com/takanory/status/1286531493871751168/photo/1) - nvim - ちょっとしたプロジェクトならこれで回せそう - でも、JetBrainsには勝てない --- ## 4.1.0 関数定義 5種類定義する方法がある(呼び方はどれも`greetN("Peacock")`のはず ```typescript // 関数コンストラクター <-危険? :thinking_face: let greet5 = new Function('name', 'return "hello " + name') ``` 式と書いてあるのは` = `がついているから? > それらはなぜ安全でないのでしょうか? 最後の例をコードエディターに入力すると、その型は Function (関数)と表示されます。この Function 型とは何でしょうか? それは、(ご存じのとおり、後ろに () を置くことで)呼び出しが可能で、 Function.prototype のプロトタイプメソッドをすべて持っているオブジェクトのことです。しかし、そのパラメーターと戻り値は型付けされていないので、任意の引数を渡してその関数を呼び出すことができ、どの町でも違法となるであろうことをあなたがするのを、TypeScript は手をこまねいて見ているだけなのです。 ## 4.1.1 Optional & Dafault Paramerter シンプルな関数だと` = `を使って、複雑化してくると`someType = {}`? `?`を使う場面はあるのか? ## 4.1.2 可変長引数 `...`を使うことで任意の長さの引数を定義できる pythonだと`*args`に型をつける? ## 4.1.3 call, apply, bind `apply`は2番目がarray? `call`はそのまま可変長の引数を受け取れる? `bind`は新しい関数を生成しただけなので、使うには()が必要 使う場面がいまいち想像できない... ## 4.1.4 this 黒魔術的?に使われるthisも、型付けするとこわくない? ## 4.1.5 Generator だいたいpythonのGeneratorと同じ?型付けできるのも似ている `function*`と宣言する ## 4.1.6 Iterator for-ofは内包表記的な書き方? unpack, splitは直感的 ## 4.1.7 Call Signature 関数でアノテーションだけできるのは便利そう ## 4.1.8 Contextual Typing インラインで宣言していないとだめ、なぜだろう? ## 4.1.9 Types of Overloaded Function 関数内でifで分岐したり、引数の名前にofが入るのが気持ち悪いけど、他にいい案が浮かばない ## 練習問題 ### 1 > TypeScriptは、関数の型シグネチャのうち、どの部分を推論するでしょうか? パラメーターでしょうか、戻り値の型でしょうか、それともその両方でしょうか? ~~両方~~ -> 戻り値(両方のときもある) ### 2 > JavaScript の arguments オブジェクトは型安全でしょうか? もしそうでないとすると、代わりに何が使えるでしょうか? 安全でない。`...`を使うべき ### 3 > すぐに出発する旅行を予約する機能が欲しいとします。オーバーロードされた `reserve` 関数(「4.1.9オーバーロードされた関数の型」を参照)を、3 番目の呼び出しシグネチャを作成して書き換えてください。このシグネチャは、目的地( `destination` )だけを取り、明示的な出発日( `from` )は取りません。この新しいオーバーロードされたシグネチャをサポートするように、 `reserve` の実装を書き換えてください。