Hao*_*eng 5 mixins typescript ecmascript-6
我正在尝试在 TypeScript 中使用 ES6 Mixin。我所拥有的如下所示,它与BaseClass.
class BaseClass {
public foo() {}
};
interface IMyMixin {
foo2();
}
let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin {
public foo2() {}
}
class MyBaseClass extends MyMixin(BaseClass) {
}
Run Code Online (Sandbox Code Playgroud)
但是我不能申请MyMixin派生类 from BaseClass; 同时,我也不能使 mixin 通用。
有没有办法让它同时适用于BaseClass和DerivedClass?
class DerivedClass extends BaseClass {
public bar() {}
}
class MyDerivedClass extends MyMixin(DerivedClass) {
public something() {
// Compile Error: Property 'bar' does not exist on type 'MyDerivedClass'
this.bar();
}
}
// Compile Error: 'T' only refers to a type, but is being used as a value here.
let MyMixin = <T extends BaseClass>(superclass: typeof T) => class extends T implements IMyMixin {
public foo2() {}
}
Run Code Online (Sandbox Code Playgroud)
我从TypeScript/PR#13743找到了解决方案,并根据@Maximus 的评论对其进行了优化。
这段代码有效。原因是, inMyMixin应该T是一个Class(即构造函数),而不是类型。
type Constructor<T> = new (...args: any[]) => T;
class BaseClass {
public foo() { }
};
interface IMyMixin {
foo2();
}
// `implements IMyMixin` is optional.
let MyMixin = <T extends Constructor<BaseClass>>(superclass: T) => class extends superclass implements IMyMixin {
public foo2() { }
}
class DerivedClass extends BaseClass {
public bar() {}
}
class MyDerivedClass extends MyMixin(DerivedClass) {
public something() {
this.bar();
this.foo();
this.foo2();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |