Open
Description
🔎 Search Terms
filter + typeguard + control flow + strictNullChecks
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about filter + typeguards + control flow + strictNullChecks
⏯ Playground Link
💻 Code
const raw: string[] | (string | null)[] = [];
const filtered: string[] = raw.filter((step: string | null): step is string => typeof step === 'string') // KO
// Type '(string | null)[]' is not assignable to type 'string[]'.
const raw: string[] |(string | null)[] = ["plop", null];
const filtered: string[] = raw.filter((step: string | null): step is string => typeof step === 'string') // OK no error
🙁 Actual behavior
There is a strange difference in control flow when you filter nullish values in an array regarding the declaration of that array. This is definitely a edge case. The type string[] | (string | null)[]
comes from an union type in my case.
🙂 Expected behavior
No difference and typeguard should work (regardless the fact it is valid).
Additional information about the issue
I first thought it was a regression due to #57465 but I tested it on several version. The issue has always been here. I looked into a lot of issues about typeguards and filters but unfortunately, could not find one similar to my issue 😢
Thanks anyway for the great job