汎用的なAPIラッパーを書いてるんですが、`<T extends ...>` で受け渡すときに `unknown` に推論されてしまって、呼び出し側で毎回キャストすることになってます。型推論を効かせるための書き方のコツってありますか? 簡単なサンプルコードはあるので、必要なら追記します。
Genericsで型推論が効かないときの定石を整理しておきます。 - 引数として登場する型変数は推論されやすい(`function f<T>(x: T): T`) - 戻り値だけに登場する型変数は明示が必要(`function f<T>(): T` は呼び出し側で `f<string>()` 必須) - `extends` で制約を付けると推論精度が上がる - ユーティリティ型(`Awaited`, `ReturnType`, `Parameters`)は積極的に使う `as` だらけになる場合、関数のシグネチャ設計が難しすぎるサインです。1段階分割すると解けることが多いので、いったんラップ関数を作ってみてください。 具体コードあれば、もう少し踏み込んで見られます。
補足ですが、似たような構成を別チームで運用したとき、運用フェーズで一番効いたのは「ロギング・モニタリングの初期投資」でした。技術選定そのものより、観測性を後から整えるコストの方が痛いです。