我想扩展一个类并将其动态类型合并为特定类型(从T
到Person
)。从泛型到特定类型
我已经创建伪类这个例子:
class Person {
constructor(public name: string){}
}
class Base<T> {
reference?: T
name: string
constructor(name: string) {
// Assign properties from T to this
this.name = name
}
static fromObject<T extends { name: string }>(object: T){
const base = new Base(object.name)
base.reference = object
return base
}
}
class Master<T> extends Base<T> {
static fromBase<T>(base: Base<T>){
const master = new Master(base.name)
master.reference = base.reference
return master
}
static fromObject<T extends { name: string }>(object: T){
return Master.fromBase(Base.fromObject(object))
}
}
class PersonMaster extends Master<Person> {
constructor(person: Person){
super(person.name)
this.reference = person
}
static fromBase(base: Base<Person>){
return new PersonMaster(base)
}
}
编译器返回此错误:
类静态侧typeof PersonMaster
错误地延伸的基类的静态侧typeof Master
。财产类型fromBase
不兼容。 (base: Base<Person>) => PersonMaster
型不可分配到<T>(base: Base<T>) => Master<{}>
。参数base
和base
的类型不兼容。 Base<T>
型不可转让给Base<Person>
。类型T
不能分配给Person
。
谢谢,下次使用时我会考虑到这一点,但它会给我'静态成员不能引用类类型参数.'如果我没有在函数定义中指定'T',错误 – Akxe
我没有知道关于静态成员。看起来像是TypeScript设计师的疏忽,尽管我确信它有一个很好的理由。无论如何,我认为你有一个设计问题:重写静态成员是一件很奇怪的事情。重写是一种固有的动态行为,所以如果某些东西需要被重载,你应该把它作为一个实例属性 - 换句话说,提取一个'MasterFactory'类 –
我应该在typescript GitHub上写一个问题吗?为什么重写静态方法很奇怪,为什么使用工厂呢?并编辑你的答案,因为它不幸是不正确的。 – Akxe