## 事象
`args`にある[[プロパティ (TypeScript)|プロパティ]]が指定されていたら、推論される戻り値の型を変更したい... けど実際は以下のケースが推論できない。
```ts
declare function hoge<C extends string | undefined>(args: {
required: string;
optional?: C;
}): C extends string
? { result: unknown; option: unknown }
: { result: unknown };
const a = hoge({ required: "hoge", optional: "hoge" });
// {
// result: unknown;
// option: unknown;
// }
const b = hoge({ required: "hoge", optional: undefined });
// { result: unknown }
const c = hoge({ required: "hoge" });
// 期待する型
// { result: unknown }
// 実際の型
// {
// result: unknown;
// option: unknown;
// } | {
// result: unknown;
// }
```
## 原因
`hoge({ required: "hoge" })`と呼び出した場合、`optional`は指定されていないため `C` は型が不明となる(`undefined`とはならない)。そのため、`optional`に代入し得る型、すなわち`C`の可能性として `string | undefined` と推論されてしまうから。
## 解決方法
[[型パラメーター (TypeScript)|型パラメーター]]にデフォルト値として`undefined`を指定する。この書き方をすることにより、`optional`が指定されなかった場合はデフォルト値で指定した型として推論される。つまり、`C: undefined`となり、`{ result: unknown }` と推論される。
```ts
declare function hoge<C extends string | undefined = undefined>(args: {
required: string;
optional?: C;
}): C extends string
? { result: unknown; option: unknown }
: { result: unknown };
const a = hoge({ required: "hoge", optional: "hoge" });
// {
// result: unknown;
// option: unknown;
// }
const b = hoge({ required: "hoge", optional: undefined });
// { result: unknown }
const c = hoge({ required: "hoge" });
// { result: unknown }
```