所以我正在嘗試構建這個模型系統,我希望加載方法回傳“用戶”型別而不是“模型”。
在 Javascript 中,我相信它可以作業,但在 Typescript 中,型別總是指模型。
是否可以讓它回傳用戶型別。
class Model {
constructor() { }
static load() {
return new this();
}
}
class User extends Model { }
let user = User.load();
// let user: Model <-- I wanted it to be of type User
謝謝
uj5u.com熱心網友回復:
類的靜態方面不直接支持多型this型別。有關相關功能請求,請參閱microsoft/TypeScript#5863。幸運的是,您可以通過使用this引數來模擬您想要的行為,并使該load()方法在多型實體型別中通用。像這樣:
class Model {
constructor() { }
static load<T extends Model>(this: new () => T) {
return new this();
}
}
本質上,該load()方法只能在其this背景關系是無引數建構式的物件上呼叫。的實體型別this是泛型型別引數T,因此return new this()會產生 的回傳型別T。因此,XXX.load()應該回傳與 的實體型別相同的型別XXX。
讓我們測驗一下:
class User extends Model {
name = "abc"
}
let user = User.load(); // let user: User
console.log(user.name.toUpperCase()) // "ABC"
看起來不錯,現在user是所需的型別User。
另外,請注意,您必須在其建構式不需要引數的類上呼叫它。如果您創建的類不能以這種方式作業:
class Confuser extends Model {
constructor(public name: string) {
super();
}
}
然后它將繼承靜態load()方法,但編譯器不會讓你呼叫它:
let confuser = Confuser.load(); // error!
// Type 'new (name: string) => Confuser' is not assignable to type 'new () => Confuser'
這是一件好事,因為new this()將無法提供所需的建構式引數,從而可能導致運行時問題:
console.log(confuser.name.toUpperCase()) // compiler is happy, but:
// ?? RUNTIME ERROR, confuser.name is undefined
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523047.html
標籤:打字稿班级延伸
