読者になるねののお庭。Toolをリリースしました。サーバサイドはC#で書く前提です。こんなご時世なのでサーバとクライアントを通信させない、なんて事は滅多にないでしょう。APIの場合はhttpのbodyですが、をどのような形で定義/シリアライザして運用しているでしょうか?おそらく大多数がJSONとしてシリアライズされた文字列を乗っけて通信させていると思います。めんどくさいのが、どのようにクライアントとサーバ間のシリアライズされたデータの型の整合性を取るか、という事です。プロパティ名をタイポしてシリアライズでこけたりね、あると思います。JSONを使う場合、もっとも素朴にはサーバ側で定義した型のプロパティ名などをぺちぺち手作業でクライアント側にもコピペして、型も一致するように手動でアノテーションしていくという事でしょう。したプロトタイプくらいならこれでも全く問題ないと思います。実際には大量のAPIが生えてくるので、それを全部手作業でコピペしたりアノテーションしたりするのはあまりにもつらすぎます。手作業でやる事でプロパティ名のタイポや型のミスマッチなどが発生してきます。なによりサーバサイドでコードに変更を加えたら、クライアント側のコードも変更しないといけません。サーバ側でコードに変更を加えたら、クライアント側のコードもそれに追従してほしい。する事で、もし修正が必要なのであれば、実行時エラーではなくコンパイル時にエラーを吐いてくれるようになります故。既存の解決手段まぁ、辛みを覚えるポイントはみんな似たような所なので、幾つかの解決方法が世に出回っています。以下のようなのツール達を使って、サーバ/クライアントの双方のコードを生成してしまえ、というのがよくある方針かと思います。(C#で型定義したい)。Schemaは恐ろしく読み辛いです。OpenAPIからサーバ/クライアントの双方のコードの生成というのもありますが、OpenAPIに沿った仕様定義するのは当然(?)苦痛なんですが、生成されるコードもお気に召しませんでした。(もちろん、すべて個人的な感想にすぎません。)IDLというか中間表現というかを書いて、C#やTypeScriptコードを生成するのではなく、C#コードからTypeScriptコードを生成できると嬉しいのです。そこでNSwagでは、OpenAPIの仕様定義からC#コードを吐き出すのではなく、C#のコードからOpenAPI定義を吐き出し、それを元にTypeScriptのクライアントコードを生成する、という事ができるようになっています。NSwagが生成されるTypeScriptコードはお気に召しませんでした。C#の名前空間を無視するので名前衝突が起き、その場合勝手にしれっと型名を変更したりします。aliasではなくclassとinterfaceとして生成されていたり。あとNSwagでは型定義だけでなく、クライアントコード(fetchをラップしたやつ)も吐き出されるんですが、JSONでシリアライズする前提だったり、なんだかなぁというポイントが多かったのです。C#からTypeScriptのコードを生成するなら、TypeScriptでのプロパティの型がC#のどの型に由来するものなのか、ぱっと分かると嬉しいです。C#からTypeScriptのコードを生成するとintやfloatなどの数値型は全てnumberにならざるを得ないですし、Guidもstringにならざるを得ないので。いう具合なので、そのあたりは消し飛んでしまっています。Tool及びAnalyzerを作りました。Attribute付与してCLI叩くだけ。Analyzerも入れておけばCLI叩く前にIDE上であれこれ教えてくれるので問題も発生しづらいと思います。TapperコードはGitHubに。GitHubでスター☆押してくれると私が咽び泣いて喜びます。Toolとしてtapperをinstallします。helpでプロジェクトには以下のパッケージを追加。Tapper.Analyzerは無くても平気なんですが、あると何かとIDEが教えてくれるようになるので便利です。}}以下のコマンド叩くだけ。outdiroutdir以下にSampleNamespace.tsというTypeScriptファイルが作成されています。C#の名前空間毎にファイルが切られているので、名前衝突などは起きません。出力が以下のような感じ。JSDocでどの型からトランスパイルされたよ~というのが記述されているので、コーディングの助けになります。string);}C#のプロパティ名そのままTypeScriptにするとPascalCaseになってキモいんだけど、というのであれば、--naming-styleにcamelCaseを渡せば期待通りになるでしょう。camelCaseまたシリアライザにJsonじゃくなくてMessagePack使いたいんだが、という場合もあるかと思います。MessagePackという値を渡す事で解消できます。MessagePackあとはGitHub上でREADMEを読んでくれると嬉しいです。Toolを作成しました。github.com実はこれ、Tapper.Attributesの中に定義されているTranspilationSourceAttributeを自分のプロジェクトにコピペしてしまえば、完全にゼロ依存で使えるようになっています。Schema、OpenAPIと心中しておらず、実は手作業でサーバサイトとクライアントサイドの型定義を書いているんだ...という方がいらしゃったら、是非どうでしょうか。読者になる関連記事2023-12-312023年振り返り。実際にどうやって動いているか。【C#】マルチスレッド関連操作の詳説。リクエストの回復力を高める。3引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。