nodejs / nodejs/node

`FormData` implementation/types mismatch

Offen
#58,481 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

Version

v22.6.0

Platform
Darwin esmbp2023 23.5.0 Darwin Kernel Version 23.5.0: Wed May  1 20:17:33 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6031 arm64
Subsystem

Fetch

What steps will reproduce the bug?

Regarding FormData type definition (https://github.com/nodejs/node/blob/main/deps/undici/src/types/formdata.d.ts):

The majority of methods are defined as instance methods (e.g., append, set, getAll, etc.):

// EXAMPLE
export declare class FormData {
  // ...
  append (name: string, value: unknown, fileName?: string): void
  // ...
}

But the following methods are defined as properties:

  • forEach
  • keys
  • values
  • entries
  • Symbol.iterator
// EXAMPLE
export declare class FormData {
  // ...
  forEach: (
    callbackfn: (value: FormDataEntryValue, key: string, iterable: FormData) => void,
    thisArg?: unknown
  ) => void
  // ...
}

This prevents extending those methods when extending FormData:

// EXAMPLE
class StrictFormData<T> extends FormData {
    /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/entries) */
    entries = <TK extends keyof T & string>(): IterableIterator<
        [TK, T[TK]]
    > => {
        // ERROR: TS2855: Class field entries defined by the parent class is not accessible in the child class via super.
        return super.entries() as IterableIterator<[TK, T[TK]]>;
    };
}
// EXAMPLE
class StrictFormData<T> extends FormData {
    /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/entries) */
    // ERROR: TS2425: Class FormData defines instance member property entries, but extended class StrictFormData<T> defines it as instance member function.
    entries<TK extends keyof T & string>(): IterableIterator<[TK, T[TK]]> {
        // ERROR: TS2855: Class field entries defined by the parent class is not accessible in the child class via super.
        return super.entries() as IterableIterator<[TK, T[TK]]>;
    }
}

Is it a mistake in the type definitions?

When looking at the implementation (https://github.com/nodejs/node/blob/main/deps/undici/src/lib/web/fetch/formdata.js) I don't see any of those methods added, neither "statically", nor dynamically upon construction. I might be missing something because exactly those atypically defined methods are the ones that I cannot find in the implementation.

Thanks!

How often does it reproduce? Is there a required condition?

See above.

What is the expected behavior? Why is that the expected behavior?

See above.

What do you see instead?

See above.

Additional information

See above.

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

Vergleiche deps/undici/src/types/formdata.d.ts mit deps/undici/src/lib/web/fetch/formdata.js und konzentriere dich dabei auf forEach, keys, values, entries und Symbol.iterator. Reproduziere die TypeScript-Fehler beim Ableiten von Klassen aus dem Issue und bestimme, ob die Deklarationen oder die Implementierung vom beabsichtigten Verhalten abweichen. Als erledigt gilt die Aufgabe, wenn die FormData-Typen und das Laufzeitverhalten konsistent sind und der gemeldete Erweiterungsfall behoben ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, nodejs, typescript
Bereich
api, backend
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

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