不要与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具体是什么意思?具体地说,相同的返回类型是什么意思?