microsoft / microsoft/TypeScript
[Regression] TS2562 - mixins cannot accept generic types
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 132
Descripción
TypeScript Version: 2.6.0 and more
Search Terms: mixin, 2.6.
Code
export interface Constructor<T = any> extends Function {
new(...args: any[]): T;
}
class A<T> {
public a: T;
}
class B<T> {
public b: T;
}
function Mixin<T>(...classes: any[]): Constructor<T> {
return function() {
// whatever, not the purpose of the demonstration
} as any;
}
interface IAB<T, U> extends A<T>, B<U> {}
// on typescript 2.6.0 and more, its no more possible to use generic types into mixins....
class AB<T, U> extends Mixin<IAB<T, U>>(A, B) {
}
// on typescript 2.6.0 we're forced to write
// class AB<T, U> extends Mixin<IAB<any, any>>(A, B) {}
// so we loose type checking...
// intentional type error
class testClass extends AB<boolean, string> {
public a: number; // before 2.6.0 => type of 'a' properly detected as wrong, boolean expected
}
Expected behavior:
Like before typescript 2.6.0, extending a class with a mixin which takes generic types should be allowed.
Using mixin is a really common usage in js/ts to build classes which implement/inherit properties from more than one classe (sometimes named 'factories'). Before 2.6.0, typescript properly detected the union of class having generic types, but currently this generates TS2562 errors, so its no more possible to construct typed generic mixins.
In a more generic way:
function A<T>() {
return class {};
}
// should be allowed
class B<T> extends A<T>() {}
Actual behavior:
TS2562, Base class expression cannot reference class type parameters (on T and U)
Playground Link: here
Related Issues: Partially related https://github.com/Microsoft/TypeScript/issues/19668
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 reproduciendo TS2562 con el ejemplo de código proporcionado o Playground Link usando las versiones afectadas de TypeScript. Investiga el comportamiento del checker para los parámetros de tipo genéricos de clase a los que hacen referencia las expresiones de clase base de los mixins y, después, añade cobertura que demuestre que el mixin genérico se acepta y que el error intencionado de tipo de propiedad sigue detectándose.
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
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 35/100