microsoft / microsoft/TypeScript

ThisType is invalid when using object spread on generic object

Offen
#52,207 5 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Domain: This-Typing Help Wanted
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

Bug Report

🔎 Search Terms

ThisType Object Spread Generic

🕗 Version & Regression Information
  • I was unable to test this on prior versions because I was not using this feature previously
⏯ Playground Link

Playground link with relevant code

💻 Code
function createObject<D extends {}>(def: D & ThisType<D>) { /* some code */ }

const namableObject = { name: '' };
// ThisType will be wrongly typed when using object spread
const spreadObject = createObject({
  ...namableObject,
  get thisName() {
    return this.name; // <-- Property 'name' does not exists on type '{}'
  },
});
// Correctly typed otherwise
const fullObject = createObject({
  name: '',
  get thisName() {
    return this.name;
  },
});
🙁 Actual behavior

The generic type is broken when the given object value contains a spread object.

🙂 Expected behavior

The generic type should contain the spreaded object properties as those are finally included into the result object.

Comment

This may be related to #26412 and other issues like this one but I didn't found a workarround to get a ThisType correctly typed.

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 der verknüpften TypeScript Playground-Reproduktion und vergleiche die Aufrufe von createObject mit und ohne Spread, um zu untersuchen, wie die generische Inferenz das Spread-Objekt und den ThisType-Kontext behandelt; erledigt ist die Aufgabe, wenn der Getter in spreadObject die name-Eigenschaft erkennt, ohne den bestehenden fullObject-Fall zu beeinträchtigen.

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.