我有一系列的类混入,在普通的JavaScript中可以使用。
const
AsFoo = ( superclass ) => class extends superclass {
get foo(){ return true; }
},
AsFooBar = ( superclass ) => class extends AsFoo( superclass ){
get bar(){ return true; }
},
FooBar = AsFooBar( Object ),
fb = new FooBar();
console.log( fb.foo, fb.bar );
// true, true
然而,当我将它们翻译为TypeScript时,
AsFoo( superclass )
会出现错误。type Constructor<T = {}> = new ( ...args: any[] ) => T;
interface Foo {
foo: boolean;
}
interface FooBar extends Foo {
bar: boolean;
}
const
AsFoo = <T extends Constructor>( superclass: T ): Constructor<Foo> & T => class extends superclass implements Foo {
get foo(){ return true; }
},
AsFooBar = <T extends Constructor>( superclass: T ): Constructor<FooBar> & T => class extends AsFoo<T>( superclass ) implements FooBar {
get bar(){ return true; }
};
// Type 'Constructor<Foo> & T' is not a constructor function type. ts(2507)
有没有什么方法可以让 TypeScript 与这种模式一起使用? 我不想简单地使用// @ts-ignore: ¯\_(ツ)_/¯
。
我目前使用的是 TypeScript 3.2.4。
AsFooBar
中的 TypeScript 不允许您从泛型类型参数进行扩展。Mixin 是此规则的特殊例外,它们仅在特定情况下允许使用。我建议您采用以下答案中的方法... - Titian Cernicova-Dragomir