与 TypeScript 混合模式?

yaq*_*awa 4 mixins typescript

我读过这篇文章。 https://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/

这是文章中的 JavaScript 原始代码:

class MyClass extends mix(MyBaseClass).with(Mixin1, Mixin2) {
  /* ... */
}

Run Code Online (Sandbox Code Playgroud)
let mix = (superclass) => new MixinBuilder(superclass);

class MixinBuilder {
  constructor(superclass) {
    this.superclass = superclass;
  }

  with(...mixins) { 
    return mixins.reduce((c, mixin) => mixin(c), this.superclass);
  }
}

Run Code Online (Sandbox Code Playgroud)

我想知道如何在打字稿中创建这样一个 mixin 实用程序助手,以便我可以获得类型命中和静态代码分析。

any我已经尝试了几个小时......但如果不使用某些类型就无法完成它,如果我使用any我会错过所有类型提示,这不是我想要的。

Eli*_*ski 6

您可以使用链接,因为否则所有 Mixin 都必须使用泛型具有相同的返回签名:

interface Ctor<T = NonNullable<any>> {
    new(...params: any[]): T;
}

interface MixIn<Superclass extends Ctor, Extension extends Ctor> {
    (ctor: Superclass): Superclass & Extension;
}
function mix<T>(superclass: Ctor<T>) {
    return new MixinBuilder(superclass);
}

interface Mixed<T extends Ctor> {
    with<K extends Ctor>(mixin: MixIn<T, K>): Mixed<ReturnType<MixIn<T, K>>> & ReturnType<MixIn<T, K>>;
}

class MixinBuilder<T extends Ctor> {
    superclass: T;
    constructor(superclass: T) {
        console.log(superclass);
        this.superclass = superclass;
    }

    with<K extends Ctor>(mixin: MixIn<T, K>): Mixed<ReturnType<MixIn<T, K>>> & ReturnType<MixIn<T, K>>  {
        const mixed = mixin(this.superclass);
        return class extends mixed {
            static with<K extends Ctor>(mixin: MixIn<typeof mixed, K>) {
                return new MixinBuilder(mixed).with(mixin);
            }
        } as any;
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

  • 哇,干得好!!!!!!!唯一遗憾的是你必须手动指定返回的 mixin 类的接口。有没有更好的解决方案,以便编译器可以自行推断 mixin 的接口? (2认同)