almin / almin/ddd-base

mixin

Offen
#5 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
TypeScript
Sterne
77
Forks
7
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

```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;
}
}
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.