microsoft / microsoft/TypeScript

*explicit* type guard passed to Array.filter does not narrow type

Offen
#54,966 7 Kommentare 2 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.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

Bug Report

🔎 Search Terms

array.filter, type guard, explicit, is

🕗 Version & Regression Information

TS 3.9.7–5.1.6, target version ES2019 or later (releases earlier than 3.9.7 didn’t have Object.fromEntries)

⏯ Playground Link

Playground link with relevant code

💻 Code
interface Element { type: Elem['type'], children: Node_[] }
interface CodeBlock extends Element { type: 'cb', children: string[] }
interface Field extends Element { type: 'f', name: string }
interface FieldList extends Element { type: 'fl', children: Field[] }

type Elem = CodeBlock | Field | FieldList
type Node_ = Elem | string

function getMeta2(fieldLists: Elem) {
	return Object.fromEntries(
		fieldLists.children
			.filter((n: Node_): n is FieldList => typeof n !== 'string' && n.type === 'fl')
			.flatMap((fl) => fl.children)
			.map((f) => [f.name, f.children[0]?.toString()]),
	)
}
🙁 Actual behavior
> .flatMap((fl) => fl.children)
Property 'children' does not exist on type 'Node_'.
  Property 'children' does not exist on type 'string'.
🙂 Expected behavior

The return type of filter should be FieldList[]

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 dem verlinkten Playground und dem reduzierten Array.filter-Beispiel im Issue. Verfolge anschließend, wie der explizite type-guard callback geprüft wird und wie der Ergebnistyp von filter inferiert wird. Bestätige die Korrektur, indem du prüfst, dass der gefilterte Wert als FieldList[] behandelt wird und dass der anschließende flatMap-Zugriff akzeptiert wird.

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.