豊富な検証ルールをあらかじめ備えているほか、自分で拡張した検証ルールを使うこともできます。はじめ、ウェブでリクエストを受け取る機能を作った場合に、クライアントからリクエストしてきた内容を受け入れてよいかチェックする必要があります。メールのアドレスは半角の英数字から始まり@が間にあって、ドメイン名のルールが(実際にはもっと複雑)などと形式があっているかチェックする必要があります。他にもドロップダウンから選択したデータが選択できる範囲の値であるか(不正データを送ってきてないか)や、必須入力ではないけど送ってきたら数値である必要がある、などと単純な型チェックだけでもいろいろとやることがあります。Typescriptは、その「型チェック」を支援してくるライブラリになります。存在する値との整合性、入力データ間の整合性などはしてくれません。こちらはこちらで必要なことは別途実装する必要があります。)その「型チェック」ですが色々なやり方があります。各リクエストパラメーターごとにチェックの関数を呼び出したり、リクエストパラメーターに対応するクラスを定義してデコレーター(アノテーション)を付けたり。いう点で、スキーマをコード内のオブジェクトで渡せるところが良いと思い使ってみることにしました。こちらのライブラリを使おうとしたところ、インストールエラーが出てしまってプルリクを出して直してもらったことがありました。インストールエラーの修正についてのプルリクを送る」の記事になります。パッケージとして導入します。}}前半のzaPhoneNumberはカスタムの入力検証で南アフリカ共和国の+27または0始まりの電話番号チェックです。CustomMessageはデータ構造の一部をクラスとして表現し、オブジェクトリテラルとの複合を試している感じでしょうか。schemaが本題の入力検証でチェックするデータスキーマです。入力検証のルールという形式で記述します。ID()は入力データidというキーにID()の形式(実態は数値)になっているかをチェックするといった具合です。Type(String)のような単純な型チェックや、Email()などの組み込み型、RegEx()による正規表現のチェックなどがあります。必須ではないが受け取った場合はチェックするのOptional()に、来た場合のチェックを引数にルールを入れる。具体的な値の選択肢であるOptions()などもあります。ひととおりのチェックルールはまかなえています。data);を実行します。入力検証が通るとvalueが戻り値で返ってきますが、問題がある場合はエラーがスローされてくるので呼び出すだけでもよいかもしれません。再帰構造となっているようです。入力データの構造が深くなると、それに合わせてchild_errorsという形でエラーも深くなるようになっています。必要な部分だけを抜粋すると以下のような構造になります。下記はidの値が数値でなかった場合のエラーです。}}propertyとvalueで、キーと受け取った値がわかります。(キーの先頭にドットがついてますが)child_errorのdetailsにエラーメッセージが入っています。英語ですが、そのまま使えそうな感じです。データの階層が深い場合は、このデータ構造がchild_errorsという形で深く連なっていくので、そのままでは扱いにくいです。そのためサンプルに加えて以下のようなコードを追加してフラットに変換しています。関数を使ってchild_errorsからpropertyが存在する場合に、その値を取得して配列で保持するようにしています。パースする際に値を変換することができるのですが、再帰構造から必要なものだけをうまく引き出せなかったので、横から取り出すようにしました。これで具体的な入力検証エラーの部分だけを取り出せるたので、必要に応じてレスポンスするためのオブジェクトに詰めなおすことができます。シンプルなスキーマで、その場に書けるのでコーディングがしやすくきになるらいぶらりなのですが、入力検証エラー時の構造体がちょっと扱いにくいのと、エラーの型定義がサブモジュールのインポートになってしまうため、TSLintを厳しくしていると怒られるという点があり気になりました。入力検証は似て非なるデータ構造のチェックになり、クラスのデコレータベースは使いにくいと思っているので、スキーマベースという点が気に入っているのですが、エラーのデータ構造がちょっと気になります。同じキーchild_errorsに入っていてpropertyがあるかないかで、末端のエラーが情報か、中間のコンテナーかを判別しないといけないのが、あとからコードを見た時に何をしたいのか分かりにくいだろうなぁと。Typescriptを使わせてもらおうかな。2017Riotz.works投稿や発言は私的なものであり、所属する企業や組織には関係ありません。HomeSlides。