如何编写 typescript mixin 并从 tsc 获取声明

How to write typescript mixins and get declarations from tsc

我无法正确编译,因为这个带有匿名 class 的 Mixin 构造抛出。

export type Constructor<T> = new (...args: any[]) => T;
export interface IFooable {}
export default function FooableMixin<T extends Constructor<{}>>(Base: T) {
    return class extends Base implements IFooable {
        constructor(...args: any[]) {
            super(...args);
        }
    }
}
export class BaseBar {}
export class FooableBar extends FooableMixin ( BaseBar ) {}

在使用 tsconfig 参数声明 = true 进行编译时,我得到了 TS4093、TS4020 和 TS4060。没有参数它工作正常但是我没有得到任何声明。

好像是因为匿名的class无法导出(madepublic)。

是否有更好的编写 mixins 的方法或更好的方法来获取声明?

Typescript Issue 15001

这是由于 Typescript 的限制,并且有几个(现已关闭)问题。目前对我有用的解决方法是将 MixinFunction 的 return 类型定义为 T & ICtor> 以绕过 TS 4060。

export default function FooableMixin<T extends Constructor<{}>>(Base: T): T & Constructor<IFooable<T>> {

但是由于我们不能直接从联合类型扩展,所以我不得不:

export const _FooableBar = Fooable(BaseBar);
export class FooableBar extends _FooableBar 

这很乱,希望能得到解决。