microsoft / microsoft/TypeScript

Mixin class with type param seems to lose information about default type parameter, causing "base constructors must all have the same return type"

Aperta
#56,005 0 commenti 4 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Domain: classes Help Wanted
Lingua principale
Go
Stelle
111k
Fork
14.4k
Merge medio
1g 19h
PR unite (30g)
117

Descrizione

🔎 Search Terms

Mixin class with type param seems to lose information about default type parameter, causing "base constructors must all have the same return type"

Related:
https://github.com/microsoft/TypeScript/issues/37142
https://github.com/microsoft/TypeScript/issues/40110

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about mixins and type parameters
⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.2.2#code/CYUwxgNghgTiAEAXAngBwQYQPYDsDOiMArmIljACpogA8FAfPALzxQBGBMUp8OIA7vAAUASmaMKAbgBQ0sLgLwAQrHYQQAMWbw6KvAhAAPRCBzA88bPkIkylajQDybAFbhE9ekL0gAXPAofMSZGAG9peEio9k5uRHhIKDwLFS42dRpU7U4ASxwAc0YjEzMUpIRwqKqotlghQ39cgrFQ+DhEIhgceENJeABfCOrB6raQDq7lVXSQGX6ZOWhkqeB4YtNzKbT1DSFnN1IWwcWkiwBxLCxV9dKttU0913cRGibC+FD+oA

💻 Code
declare type ConstructorType<T> = abstract new () => T;

const BarableF = <TBase extends ConstructorType<Object>>(Base: TBase) => {
      abstract class Barable<Bar = string> extends Base {
          bar(x: string) { return x; }
      }
      return Barable;
};

class Bad extends BarableF(Object) {}

class Good extends BarableF(Object)<string> {}
🙁 Actual behavior

The line class Bad extends BarableF(Object) {} fails because "Base constructors must all have the same return type". If I hover over BarableF, I see the type

const BarableF: <ObjectConstructor>(Base: ObjectConstructor) => ((abstract new <**Bar**>() => BarableF<ObjectConstructor>.Barable<Bar>) & {
    ...;
}) & ObjectConstructor

where notably Bar has lost its default type param, which might be causing the issue.

🙂 Expected behavior

I would expect Bad to type-check without a problem, because in the Good example below it, you see that providing a type argument that is the same as the default for the type param causes things to work.

Additional information about the issue

No response

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con il TypeScript Playground collegato e riduci gli esempi Bad e Good a un caso di regressione. Analizza l'inferenza del costruttore dei mixin generici e il motivo per cui il parametro di tipo predefinito di Bar va perso; il lavoro è completato quando Bad supera il controllo dei tipi senza un argomento string esplicito, mentre Good continua a funzionare. Aggiungi il caso all'area di test del compilatore pertinente una volta localizzato il comportamento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
typescript
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.