打字稿子类工厂
Typescript subclass factory
我最近阅读了一篇关于 javascript mixins as subclass factories 的文章,其中提出了以下创建 mixin 的模式:
let MyMixin = (superclass) => class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
然后可以按如下方式使用:
class MyClass extends MyMixin(MyBaseClass) {
/* ... */
}
我想看看这是否适用于 TypeScript,但我收到以下错误:
error TS2507: Type 'any' is not a constructor function type.
尽管它仍然可以编译工作 javascript,但我做任何事情都无法消除这个错误。
如有任何建议,我们将不胜感激。在 TypeScript 中不可能像这样参数化超类吗?
它不适用于泛型(至少,我无法让它工作):
type SuperclassConstructor<T> = { new (): T };
let MyMixin = <T>(superclass: SuperclassConstructor<T>) => {
return class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
}
说:
Base constructor return type 'T' is not a class or interface type
因为它需要一个具体的class,所以你可以为所有你想用这个mixin使用的classes设置一个基础class:
class Base { }
type SuperclassConstructor = { new (): Base };
let MyMixin = (superclass: SuperclassConstructor) => {
return class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
}
class MyBaseClass extends Base {}
class MyClass extends MyMixin(MyBaseClass) {
/* ... */
}
我最近阅读了一篇关于 javascript mixins as subclass factories 的文章,其中提出了以下创建 mixin 的模式:
let MyMixin = (superclass) => class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
然后可以按如下方式使用:
class MyClass extends MyMixin(MyBaseClass) {
/* ... */
}
我想看看这是否适用于 TypeScript,但我收到以下错误:
error TS2507: Type 'any' is not a constructor function type.
尽管它仍然可以编译工作 javascript,但我做任何事情都无法消除这个错误。
如有任何建议,我们将不胜感激。在 TypeScript 中不可能像这样参数化超类吗?
它不适用于泛型(至少,我无法让它工作):
type SuperclassConstructor<T> = { new (): T };
let MyMixin = <T>(superclass: SuperclassConstructor<T>) => {
return class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
}
说:
Base constructor return type 'T' is not a class or interface type
因为它需要一个具体的class,所以你可以为所有你想用这个mixin使用的classes设置一个基础class:
class Base { }
type SuperclassConstructor = { new (): Base };
let MyMixin = (superclass: SuperclassConstructor) => {
return class extends superclass {
foo() {
console.log('foo from MyMixin');
}
};
}
class MyBaseClass extends Base {}
class MyClass extends MyMixin(MyBaseClass) {
/* ... */
}