A better way to use mixins ?
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 38/100
- Tipo de issue
- Documentación
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- typescript
- Área
- documentation
Línea de trabajo
Comienza con la página de mixins de TypeScript Handbook enlazada en el issue y revisa el ejemplo proporcionado de Playground. Evalúa cómo encajan el patrón propuesto y sus limitaciones indicadas en la documentación existente y, después, actualiza la guía de mixins con una alternativa precisa y advertencias claras.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
The document gives some examples on how to use mixin here: https://www.typescriptlang.org/docs/handbook/mixins.html
However the 2 proposed solutions has issues:
- the first one prevent us from having private/protected members, and may generate quite a lot of type deduction error in the function.
- the second is not that great regarding to type safety.
I think we have a better solution to use mixin, that could be added to the documentation:
class Base {}
// declare the added properties outside of the mixin function
abstract class Mixin {}
class K extends mix(Base, Mixin) { }
Such generic function could be implemented like this:
const MixSrc = Symbol();
type Mix<
Base extends new(...args:any[])=>any,
Mixin extends abstract new(...args:any[])=>any,
> = Omit<Base & Mixin, "new"> & (new(...args:ConstructorParameters<Base>) => (InstanceType<Base> & InstanceType<Mixin>))
function mix<
Base extends new(...args:any[]) => any,
Mixin extends abstract new(...args:any[]) => any
>(base: Base, mixin: Mixin): Mix<Base, Mixin> {
class _ extends base {}
const static_props = Object.getOwnPropertyDescriptors(mixin);
delete static_props.prototype;
delete static_props.name;
Object.defineProperties( _, static_props );
((_ as any)[MixSrc] ??= []).push(mixin);
const hasInstance = mixin[Symbol.hasInstance];
Object.defineProperty(mixin, Symbol.hasInstance, {
value: function (instance: any) {
if( instance.constructor[MixSrc].includes(this) )
return true;
return hasInstance.call(this, instance);
},
writable: false,
});
const instance_props = Object.getOwnPropertyDescriptors(mixin.prototype);
// @ts-ignore
delete instance_props.constructor;
Object.defineProperties( _.prototype, instance_props );
return _ as any; // well...
}
There are 2 limitations of this method:
- This may not work if
Mixininherit from another class ( though you could just callmixfor each of theMixinbases ). - This will not work if
Mixinhas private#properties.
If we have private properties, we can do something like:
abstract class Mixin {
// declare the public/protected interface here
}
type ExcludeProtected<T> = {[K in keyof T]: T[K]}
function addMixin<...>(base): Mix<Base, Mixin> {
return class _ extends base implements ExcludeProtected<Mixin> {
// implements Mixin methods here...
// can't guarantee the protected interface (due to TS limitations).
} as any;
}
But then Mixin must not inherit from another class.
- Lenguaje dominante
- TypeScript
- Estrellas
- 2.6k
- Forks
- 1.5k
- Merge medio
- 2 d 21 h
- PR fusionados (30 d)
- 7
Preparar el entorno
Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
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.
Más de microsoft/TypeScript-Website
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
microsoft/TypeScript-Website#3607 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 65/100
microsoft/TypeScript-Website#3039 ·
Los mantenedores suelen responder en 1 día
-
More examples of `infer`Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
microsoft/TypeScript-Website#2998 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
microsoft/TypeScript-Website#3614 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
microsoft/TypeScript-Website#3583 · 3 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
Todos los issues de microsoft/TypeScript-Website
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
betagouv/mon-entreprise#4699 ·
Los mantenedores suelen responder en 3 días
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
jaegertracing/jaeger-ui#4547 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
ai-driven-qa
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
linagora/twake-calendar-frontend#1467 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
need4deed-org/sdk#267 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
auth0/universal-login#414 ·
Los mantenedores suelen responder en 1 día