microsoft / microsoft/TypeScript

[Control flow] Array filter with typeguard works differently following array initial value

Offen
#60,108 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Domain: check: Control Flow Help Wanted Possible Improvement
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

🔎 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

https://www.typescriptlang.org/play/?strict=false&noImplicitAny=false&strictFunctionTypes=false&strictPropertyInitialization=false&strictBindCallApply=false&noImplicitThis=false&noImplicitReturns=false&alwaysStrict=false&esModuleInterop=false&declaration=false&target=0&jsx=0&module=0&ts=5.6.2&experimentalDecorators=false&emitDecoratorMetadata=false#code/MYewdgzgLgBATgQwO4C4bTgSzAcwNoC6MAPjAIJyICeAPBtjiTGAK4A2bAfDALwyEBuAFBDQkWADNMbKAFM4sgCZp6uQr3jIAdFJnyAFPuiyADiqhZcTVhwCU50zEwR0Fhr25QqJ2SAmvHHiCYAHJVHBDbGAB6aJgAaQB5ETFoV0scACVkcwz1UgpqOjcrUhsuDTwAIhM2EBMqgmFRcDTwgDFpOQVldIZ1PnDspB0ugyM5Mz7S5nY2ewCTJxdwjxgvHz9F3mCwkoio2ITklvFZjmHc-qICygRaVbK57j48cqaU1thyzr0eq7URD45WGoz+hmMU0e53mDiWzmmjB4nm8vn8kJ2fD2GUiMTiiXinzO5QACmwWBAAMr7S6I-LkO4PfbWZ6VGp1BoAGhhH1OaVJ5Kp+1+3SUAPwQJhZIp1IyoN03Qhk3FLLscOWiLWGzR2yCWPCuKOBKEQA

💻 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den verlinkten TypeScript Playground-Beispielen und vergleiche die beiden Deklarationen von raw: ein leeres Union-Array gegenüber einem mit Werten initialisierten Array. Untersuche, wie filter's type predicate für jeden Control-Flow-Pfad geprüft wird. Als abgeschlossen gilt die Aufgabe, wenn beide Beispiele die Zuweisung zu string[] konsistent akzeptieren und das demonstrierte Verhalten durch Tests abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.