golangのAPIとTypescriptで困ったこと
golangでWEB APIを作成し、JavascriptでAjaxとしてデータ取得やデータ編集を行った際に、かなり大変だったため書いてみようと思います。
事前知識があるだけで大分変わっていたかと思います。
Angular6での実装でTypescriptを使用しています。
Typescriptに詳しくないため動作を確認して困った部分を書いていきます。対策等があれば知りたいです。
入力フォームに型は関係ない
Typescriptは型を指定できる。みたいですが、コードを書く際の参考程度にしかなっていない気がしていて困っています。
まぁ、結局Javascriptに変換しているから動作自体はJavascriptになるため、型があるようでない仕様な気がしてます。
例えば入力フォームにnumber型のパラメータを渡す場合 ( ※コードは適当 )
<script> let inputAge : number = 0; </script> <input type="text" [ngModel]="inputAge" >
ちゃんとフォームに「0」が表示され、変数の型をtypeof で確認すると、numberになります。
次に入力フォームに「1」と入力をすると、変数の型が「string」に変わっています。
確かにinputのtypeがtextですから、入力はstringになるのは納得します。ただnumberだったのが、入力することでstringに変わるのはかなり困りますね。
型を意識しなくて済むのはありがたいですが、指定した型ならそのままであったほしいですが、Javascriptとして型がないためどうしようもないかな。と思っています。
入力フォームの時点で、型をstringにしておくのが無難だと思います。
ただほかの入力フォーム(radio、checkbox)では、また違ってくると思うので、調べて対策をたてた方がいいですね。
変数のキャスト
フォームの部分に影響して、キャストに困りました。
変数の型をnumberにしているが、データがnullがきた場合には、toString()とかないですよね。初期化しても、WEBAPIでデータを取得した状態のため、そのあとに対処をする必要があります。
またフォームの入力で型が変わっていたりすると、数値計算とかに影響もでたりして常にキャストが必要になってきます。(キャストしないと安心できない)
ただし型を宣言している場合には、使用できる関数が型ごとに限定されます。当たり前ですが、想定される内容は型を指定した内容です。
ここでもgolangの「入力はInterfaceで、返却は型」の理念で、関数にキャストを任せるようにして対処しました。
これだけでかなり安定しました。
テストの意識の切り替え
いままでPHPで開発をしていた際にはAPIを中心に開発をしていないため、入力値と出力値で型が変わるケースがないため、「画面で登録→画面表示」が正しくできていれば、大丈夫でした。
今回のAPIベースに変わったことで、「画面で登録→画面表示」「画面表示→再登録」までテストを実施することが必要になりました。
理由としては、ajaxでデータを取得した際に最初に送った際の型と再登録で送った型が違う可能性が発生することになります。
登録でき表示できてるから大丈夫でしょ。という概念を捨てて、再度登録できるか、また再度入力して登録できるかどうかもチェックする必要があります。
最初からこういうケースがある。という意識さえすれば、開発時に意識して対応できると思います。
今回は、知らなかったためそのままでやるしかないですねー。次は意識して最初から対策したいです。
チャレンジは必要
APIベースになるため、言語が分けられたり、複数プラットフォームへの対応がしやすくなったり、開発言語の更新など分離できているためやりやすくなります。
ただやっぱりチャレンジすること自体は大変です。
チャレンジすることで次の仕事に活きてくると思うので、チャレンジしていきましょう。
ただチャレンジするにしても、人財というのは重要ですね。やっぱり仕事は人だと思います。
頑張りましょう。