【发布时间】:2019-08-23 06:14:30
【问题描述】:
我有一个在纯 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中的打字稿不喜欢您从泛型类型参数扩展。 Mixin 是此规则的一个特殊例外,它们仅在特定场景中允许使用。我会选择下面的答案.. -
@ShaunLuttin,感谢您的链接。我去看看。
标签: javascript typescript mixins typescript-generics