如何基于Generic继承不同的class?
How to inherit from different class based on Generic?
几天来我一直在努力解决这个问题,似乎已经达到了我的 TS 能力,非常感谢您的帮助。
我有一些相当复杂的类型,但我会为此目的尽量简化它。
假设我有两个 classes Score 和 Metric,每个都有两个派生的 classes,它们应该实现其他方法并且具有稍微不同的属性,所以我想让它们通用。分数可以全部来自相同的基础 class 但我的指标需要来自我不拥有的不同 classes。
我认为我可以使用 Mixins 实现这一点,即在 class 工厂中定义通用方法并在任一实现的构造函数中混合,但我在那种情况下失败了
在我的整个项目中,我一直在使用接口 A 和 B 来区分两种不同的功能,或者将它们保留为通用类型,在共享功能所在的位置扩展 A 或 B。
但是,现在我面临的问题是我需要根据实现使用不同的构造函数,而不仅仅是一种类型。出于我的目的,我实际上不需要访问派生的 classes 的其他方法,但我需要在运行时创建从 A 或 B 继承正确方法的对象我怀疑这实际上可能没有解决方案我需要摆脱我的 A、B 调节模式,但老实说,我不知道如何处理我的继承...
如果有人可以证实我的怀疑是否有解决方案或者我是否在这里遇到了障碍,如果可以为我的抽象推荐一个更好的模式,我将非常感激
我最终使用了这段代码。 Kellys 给了我正确的提示,但对我来说,有多个这样的模式,主要区别在于种类,这会更好一些。我将一个 Kind 类型的对象传递给构造函数(这对我来说没问题,因为我可以在 susclasses 的构造函数中完成)
interface A { isA:true}
interface B { isB:true}
class BaseA {
update(){/**do something */}
}
class BaseB {
update(){/**do something else */}
}
interface Base{
update:()=>void;//the methods here should be available when referencing a generic metric
}
type BaseConstructor = new (...args:any[])=>Base
function MetricFactory<MetricType extends BaseConstructor>(BaseX:MetricType){
return class extends BaseX{
commonMethod(){}
}
}
class MetricB extends MetricFactory(BaseB){}
class MetricA extends MetricFactory(BaseA){
someAdditionalMethod(){return this.commonMethod()}
}
function Metric<Kind extends A|B>(kind:Kind) {
return (kind as A).isA !== undefined ? new MetricA(): new MetricB()
}
class Score<Kind extends A|B>{
constructor(kind: Kind) {
this.genericMetric = Metric(kind) as Kind extends A ? MetricA: MetricB
}
genericMetric: Kind extends A ? MetricA: MetricB
}
class ScoreA extends Score<A>{
constructor(){super({isA:true})}
}
let myScore = new ScoreA()
myScore.genericMetric.update() //does something
myScore.genericMetric.commonMethod() //does common thing
myScore.genericMetric.someAdditionalMethod() //does additional thing
几天来我一直在努力解决这个问题,似乎已经达到了我的 TS 能力,非常感谢您的帮助。
我有一些相当复杂的类型,但我会为此目的尽量简化它。
假设我有两个 classes Score 和 Metric,每个都有两个派生的 classes,它们应该实现其他方法并且具有稍微不同的属性,所以我想让它们通用。分数可以全部来自相同的基础 class 但我的指标需要来自我不拥有的不同 classes。
我认为我可以使用 Mixins 实现这一点,即在 class 工厂中定义通用方法并在任一实现的构造函数中混合,但我在那种情况下失败了
在我的整个项目中,我一直在使用接口 A 和 B 来区分两种不同的功能,或者将它们保留为通用类型,在共享功能所在的位置扩展 A 或 B。
但是,现在我面临的问题是我需要根据实现使用不同的构造函数,而不仅仅是一种类型。出于我的目的,我实际上不需要访问派生的 classes 的其他方法,但我需要在运行时创建从 A 或 B 继承正确方法的对象我怀疑这实际上可能没有解决方案我需要摆脱我的 A、B 调节模式,但老实说,我不知道如何处理我的继承...
如果有人可以证实我的怀疑是否有解决方案或者我是否在这里遇到了障碍,如果可以为我的抽象推荐一个更好的模式,我将非常感激
我最终使用了这段代码。 Kellys 给了我正确的提示,但对我来说,有多个这样的模式,主要区别在于种类,这会更好一些。我将一个 Kind 类型的对象传递给构造函数(这对我来说没问题,因为我可以在 susclasses 的构造函数中完成)
interface A { isA:true}
interface B { isB:true}
class BaseA {
update(){/**do something */}
}
class BaseB {
update(){/**do something else */}
}
interface Base{
update:()=>void;//the methods here should be available when referencing a generic metric
}
type BaseConstructor = new (...args:any[])=>Base
function MetricFactory<MetricType extends BaseConstructor>(BaseX:MetricType){
return class extends BaseX{
commonMethod(){}
}
}
class MetricB extends MetricFactory(BaseB){}
class MetricA extends MetricFactory(BaseA){
someAdditionalMethod(){return this.commonMethod()}
}
function Metric<Kind extends A|B>(kind:Kind) {
return (kind as A).isA !== undefined ? new MetricA(): new MetricB()
}
class Score<Kind extends A|B>{
constructor(kind: Kind) {
this.genericMetric = Metric(kind) as Kind extends A ? MetricA: MetricB
}
genericMetric: Kind extends A ? MetricA: MetricB
}
class ScoreA extends Score<A>{
constructor(){super({isA:true})}
}
let myScore = new ScoreA()
myScore.genericMetric.update() //does something
myScore.genericMetric.commonMethod() //does common thing
myScore.genericMetric.someAdditionalMethod() //does additional thing