ちょっと複雑なジェネリクスを書いていて、推論が効かなくなったり、`as` だらけになってます。Conditional Typesと組み合わせる場面で迷うことが多くて、書き方の指針が知りたいです。
Genericsで型推論が効かないときの定石を整理しておきます。 - 引数として登場する型変数は推論されやすい(`function f<T>(x: T): T`) - 戻り値だけに登場する型変数は明示が必要(`function f<T>(): T` は呼び出し側で `f<string>()` 必須) - `extends` で制約を付けると推論精度が上がる - ユーティリティ型(`Awaited`, `ReturnType`, `Parameters`)は積極的に使う `as` だらけになる場合、関数のシグネチャ設計が難しすぎるサインです。1段階分割すると解けることが多いので、いったんラップ関数を作ってみてください。 具体コードあれば、もう少し踏み込んで見られます。
自分は逆方向の選択をして失敗した経験があるので、参考までに。安定を取った結果、興味の方向と離れて、3年後にしんどくなりました。判断基準に「3年後の自分が何やってたら満足か」を入れるのおすすめ。