[[型述語 (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で!!を使ったラムダ式の結果が型述語推論されない]]