我想擴展一個類並將其動態類型合併爲特定類型(從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