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"
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 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
💻 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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el TypeScript Playground enlazado y reduce los ejemplos Bad y Good a un caso de regresión. Investiga la inferencia del constructor de mixins genéricos y por qué se pierde el parámetro de tipo predeterminado de Bar; el trabajo estará terminado cuando Bad pase la comprobación de tipos sin un argumento string explícito, mientras Good siga funcionando. Añade el caso al área de pruebas del compilador correspondiente una vez localizado el comportamiento.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100