[英]typescript classes, interfaces and generics
我正在編寫Project
和User
這兩個類,每個類都有一個find
方法,需要調用api rest調用
嘗試#1
class Project {
find(params) {
return request({url: "/api/Project", qs: params});
}
}
class User {
find(params) {
return request({url: "/api/User", qs: params});
}
}
現在,這顯然不是很好;)沒有檢查參數,沒有定義類型,重復代碼等
嘗試#2
class Base {
constructor(private name:string) {
}
find(options) {
return request({url: `/api/${this.name}`, qs: params});
}
}
class Project extends Base{
constructor() { super("Project"); }
}
class User {
constructor() { super("User"); }
}
因此,略勝一籌。 減少代碼重復。 仍然沒有類型檢查。 救援接口;)
嘗試#3
interface IParams { token: string }
class Base {
constructor(private name:string) {
}
find(params:IParams) {
return request({url: `/api/${this.name}`, qs: params});
}
}
class Project extends Base{
constructor() { super("Project"); }
}
class User extends Base {
constructor() { super("User"); }
}
這是我開始遇到一些問題的地方。 Project和User api params對象都需要token
屬性。 但是,它們還需要設置userDd
和projectId
目前,我需要將兩者都添加到IParams接口中,這似乎是錯誤的。
嘗試#4
interface IUserParams { userid:number, token: string }
interface IProjectParams { projectid:number, token: string }
interface IProject {
find(params:IProjectParams)
}
interface IUser {
find(params:IUserParams)
}
class Base {
constructor(private name:string) {
}
find(params) { // I have no idea on how to "type" params
return request({url: `/api/${this.name}`, qs: params}); // likewise no idea on how to type the return value
}
}
class Project extends Base implements IProject {
constructor() { super("Project"); }
}
class User extends Base implements IUser {
constructor() { super("User"); }
}
但是,這無濟於事:因為基類定義了find
方法,編譯器如何才能驗證是否為用戶, userid
和token
傳遞了-此外,也沒有其他參數傳遞給項目,同樣對於項目也是如此
這也使我開始思考find
方法的返回值:對於項目,我需要IPromiseModel
數組,對於用戶,則是IUserModel
我嘗試更改IProject
接口以讀取
interface IProject {
find(params:IProjectParams):Promise<IProjectModel[]>
}
但我仍然可以將任何屬性傳遞給params
-即我可以
Project.find({token: "1234",foobar:true})
我懷疑這是因為我沒有在Base查找中為參數定義類型
我知道泛型必須在其中起作用,但是對我而言,我無法獲得符合這些要求的定義
我正在使用打字稿2.2.2
使用泛型,您可以執行以下操作:
interface IParams { token: string }
interface IUserParams { userid:number, token: string }
interface IProjectParams { projectid:number, token: string }
class Base<TEntity, TParams extends IParams> {
constructor(private name:string) {
}
find(params: TParams): Promise<TEntity[]> {
return request({url: `/api/${this.name}`, qs: params});
}
}
class Project extends Base<Project, IProjectParams> {
constructor() { super("Project"); }
}
class User extends Base<User, IUserParams> {
constructor() { super("User"); }
}
new User().find({
userid: 123,
token: 'test'
});
基類TParams extends IParams
的約束在這里TParams extends IParams
是可選的,因為您沒有顯式訪問令牌屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.