簡體   English   中英

打字稿類,接口和泛型

[英]typescript classes, interfaces and generics

我正在編寫ProjectUser這兩個類,每個類都有一個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屬性。 但是,它們還需要設置userDdprojectId

目前,我需要將兩者都添加到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方法,編譯器如何才能驗證是否為用戶, useridtoken傳遞了-此外,也沒有其他參數傳遞給項目,同樣對於項目也是如此

這也使我開始思考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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM