[[型述語 (TypeScript)|型述語]]を推論するには、該当の関数が4つの条件を満たす必要がある。
1. 関数が明示的な返却型、もしくは[[型述語 (TypeScript)|型述語]]を示していない
2. 関数には1つのreturn文があり、暗黙的なreturnはない
3. 関数はパラメータを変更しない
4. 関数はパラメータの絞り込みに影響をおよぼすboolean式を返却する
そのため、以下のようなコードだけでなく
```ts
declare let numberOrUndefines: (number | undefined)[];
const numbers1 = numberOrUndefines.filter((x) => x !== undefined);
// ^? number[]
```
以下のコードも推論できる。
```ts
interface Dog {
type: "dog";
name: string;
}
interface Cat {
type: "cat";
name: string;
}
declare let dogOrCats: (Dog | Cat)[];
const dogs = dogOrCats.filter((x) => x.type === "dog");
// ^? Dog[]
const cats = dogOrCats.filter((x) => x.type === "cat");
// ^? Cat[]
```
## MOC
- 📒**関連**
- 📜**アクティビティ**
- 📝**トラブルシューティング**
- [[📝TypeScriptで!!を使ったラムダ式の結果が型述語推論されない]]