打字稿:键入JavaScript mixins

时间:2020-07-30 12:09:55

标签: javascript typescript mixins

不要与Typescript mixins https://www.typescriptlang.org/docs/handbook/mixins.html

混淆

我正在尝试为我的JS项目创建类型定义文件,该项目大量使用混合。这些类型定义文件通常将由TSC从JSDocs语法生成(使用allowJs / checkJs功能),但是对于mixins来说这是不可能的,因此我手动输入它们。

我不确定执行此操作的正确方法是什么,但是到目前为止,我已经做了很好的尝试。但是,我的静态属性/方法未正确继承/未提示类型。

interface StringToFunctionMap {
  [key: string]: Function;
}

declare type Constructor<T> = new (...args: any[]) => T;

declare class LocalizeMixinHost {
  public static get localizeNamespaces(): StringToFunctionMap[];

  public static someStaticObjArr(): StringToFunctionMap[];

  public someObjArr(): StringToFunctionMap[];

  public onLocaleReady(): void;
}

declare function LocalizeMixinImplementation<T extends Constructor<HTMLElement>>(
  superclass: T,
): T & Constructor<LocalizeMixinHost>;

declare type LocalizeMixin = typeof LocalizeMixinImplementation;

const LocalizeMixin: LocalizeMixin = (superclass) =>
    class LocalizeMixin extends superclass {
        static get localizeNamespaces() {
            return [{ 'foo': () => { } }];
        }

        static someStaticObjArr() {
            return [{ 'foo': () => { } }];
        }

        someObjArr() {
            return [{ 'foo': () => { } }];
        }

        onLocaleReady() {
            // do something
        }
    }

class MyElement extends LocalizeMixin(HTMLElement) {
    static get localizeNamespaces() {
        return [{ 'bar': () => { }}, ...super.localizeNamespaces];
    }

    static someStaticObjArr() {
        return [{ 'bar': () => { }}, ...super.someStaticObjArr()]
    }

    someObjArr() {
        return [{ 'bar': () => { }}, ...super.someObjArr()]
    }
        
    onLocaleReady() {
        super.onLocaleReady();
    }    
}

您可能会看到,它对我的​​方法非常有效,除非它们是静态的。这可能是因为Constructor类型不会继承静态部分。因此,我尝试通过执行以下操作来更改LocalizeMixinImplementation以也与类本身的类型相交:

declare function LocalizeMixinImplementation<T extends Constructor<HTMLElement>>(
  superclass: T,
): T & Constructor<LocalizeMixinHost> & typeof LocalizeMixinHost;

这似乎对静态部分有效,但是现在我在LocalizeMixin(HTMLElement)上收到错误->“基本构造函数必须都具有相同的返回类型”。我现在很迷茫,我根本不理解错误的含义。 Base Constructor具体是什么意思?具体地说,相同的返回类型是什么意思?

See playground link

0 个答案:

没有答案
相关问题