microsoft / microsoft/TypeScript

Mixins created from `obj.constructor` cannot have members

Offen
#61,255 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Domain: classes 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

mixin constructor property instance

### 🕗 Version & Regression Information

- This is the behavior in every version I tried, and I reviewed the FAQ for entries about mixins

### ⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.7.3#code/C4TwDgpgBAwg9gOwM7AE4FcDGw6oDwAqAfFALxQIQDuAFAHQMCGqA5kgFxSMIgDaAugEoyJAgG4AUBMwAbRkiRQAYnDhQA3hKhQA9DqgB1XAGsuqOOgQATKAAtgwMBz0sAlsFvoARnUxwAtjr+rpjmSHAAZsA6BOAQAMqhrmDRrgroEEg6AMwAHAAsAIxaUFYQsszQvABEfshoWDio1fyc8PUY2Lh4HmlEkgC+UhGW2K6IUACyrgAergiFhFAQM8AQ1ortKJ1NeCpwREQ0SOiQqBUKnATCmtp6UADyANIlqBDA6KgIUBeKK2sbKAnM6-DQlbQRVQRGg3IbaAaDYajYDjb7TOYIABMS3+6ysin2RzgXgAVlcbiV7jA5AooAByGgAQQQiBA-gsil+gjpUHmflQb2wMhAy1WeMUXnk0FBdIIdLolP09KZLJ47PQnJpSG5vMU8iQrhYCEYXhk0BwUA80sQ20Y82AUEilri9LlABooF50A7ZTy-OgZDYvNB5ihuCjGGsbFR3LYuKVXBEIhA3ggHScvKBII6Ij8bWg7Wn6ft5a93p9vqDcYDiSTfPmdrgwdoIVCYRo4VAERIhkA

### 💻 Code

```ts
type Constructor = new(...args: any[]) => T;

class Foo {
// Work around https://github.com/microsoft/TypeScript/issues/3841
declare ["constructor"]: Constructor;
}

function Mixin1>(superclass: T) {
// OK
return class extends superclass {
foof() {}
};
}

function Mixin2(obj: T) {
// Class '(Anonymous class)' incorrectly extends base class 'T'.
// '(Anonymous class)' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Foo'.
return class extends obj.constructor {
foof() {}
};
}
```

### 🙁 Actual behavior

`Mixin1` compiles fine, but `Mixin2` has an error:

```
Class '(Anonymous class)' incorrectly extends base class 'T'.
'(Anonymous class)' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Foo'.
```

Removing the `foof` member causes it to compile without error.

### 🙂 Expected behavior

Both should compile fine because they are doing the same thing.

### Additional information about the issue

_No response_

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 damit, die verknüpfte TypeScript Playground-Reproduktion auszuführen, und vergleiche Mixin1 mit Mixin2. Konzentriere dich dabei auf den Ausdruck für die Klassenvererbung, der obj.constructor verwendet. Das Issue ist abgeschlossen, wenn Mixin2 sein foof-Mitglied ohne den gemeldeten Vererbungsfehler behalten kann, während Mixin1 weiterhin kompiliert.

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
48/100

Neue Issues direkt in Ihr Postfach

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