almin / almin/ddd-base

mixin

Abierto
#5 2 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
TypeScript
Estrellas
77
Forks
7
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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

static mixin(
this: U & Constructor,
m1: (superClass: U & Constructor) => MixinClass
): M1 & U & Constructor;
static mixin(
this: U & Constructor, m1: (superClass: U & Constructor) => MixinClass, m2: (superClass: U & Constructor) => MixinClass): M1 & M2 & U & Constructor;
static mixin(
this: U & Constructor,
m1: (superClass: U & Constructor) => MixinClass,
m2: (superClass: U & Constructor) => MixinClass,
m3: (superClass: U & Constructor) => MixinClass
): M1 & M2 & M3 & U & Constructor;
static mixin(...mixins: ((superClass: any) => MixinClass)[]) {
// FIXME: workaround for https://github.com/Microsoft/TypeScript/issues/4130
const mixinBuilder = new MixinBuilder(this);
return (mixinBuilder as any).with(...mixins);
}
*/
export function mixin(
superclass: U & Constructor,
m1: MixinClass
): M1 & U & Constructor;
export function mixin(
superclass: U & Constructor, m1: MixinClass, m2: MixinClass): M1 & M2 & U & Constructor;
export function mixin(
superclass: U & Constructor,
m1: MixinClass,
m2: MixinClass,
m3: MixinClass
): M1 & M2 & M3 & U & Constructor;
export function mixin(
superclass: U & Constructor,
...mixins: MixinClass[]
) {
return mixins.reduce((c, mixin) => mixin(c), superclass) as Constructor
}

export type Properties = { [K in keyof T]: T[K] };
export type MixinClass = Properties & Constructor

;

export class MixinBuilder {
private superclass: Constructor & U;

constructor(superclass: Constructor & U) {
this.superclass = superclass;
}

with(): Constructor;
with(m1: MixinClass): M1 & U & Constructor;
with(
m1: MixinClass,
m2: MixinClass
): M1 & M2 & U & Constructor;
with(
m1: MixinClass,
m2: MixinClass,
m3: MixinClass
): M1 & M2 & M3 & U & Constructor;
with(...mixins: Function[]): Constructor {
return mixins.reduce((c, mixin) => mixin(c), this.superclass) as Constructor;
}
}
```

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.