0

我正在尝试创建一个包装 REST api 的打字稿类,并且我想将各种方法组织到子对象中以更好地表达代码。有什么方法这样做并且仍然通过方法中的“this”保持对类实例的访问?

例如考虑以下类:

class ApiService {
  constructor() {....}

  getMedia() {}

  uploadMedia() {}

  sendMassage() {}

  recieveMessage() {}

}

我想组织上述方法,以便我能够像这样调用它们:

const service = new ApiService();
//to call getMedia()
service.media.get();
//to call sendMessage()
service.messages.send();
// and so on
4

1 回答 1

0

我认为要完全按照说明实现您的要求,您应该使用箭头函数,以便apiService.mediaandapiService.message对象没有自己的this上下文阻碍。例如:

class ApiService {

    constructor(public name: string) { }

    private getMedia() { 
        console.log(this.name+" getMedia");
    }

    private uploadMedia() { 
        console.log(this.name+" uploadMedia");
    }

    private sendMassage() { 
        console.log(this.name+" sendMessage");
    }

    private recieveMessage() { 
        console.log(this.name+" receiveMessage");
    }

    // instance methods
    public media = {
        get: () => this.getMedia(),
        upload: () => this.uploadMedia()
    }

    // instance methods
    public message = {
        send: () => this.sendMassage(),
        receive: () => this.recieveMessage()
    }

}

请注意,这意味着 的每个实例都ApiService将拥有自己的函数值属性message.send等副本。它们不会位于ApiService.prototype类似的普通方法上。除非您生成许多ApiService.

让我们确保它可以正常工作并正确绑定:

const api1 = new ApiService("One");
const api2 = new ApiService("Two");

api1.message.receive(); // One recieveMessage
api2.message.receive(); // Two receiveMessage

api1.media.get(); // One getMedia
api2.media.get(); // Two getMedia

看起来不错。希望有帮助;祝你好运!

链接到代码

于 2019-06-01T18:39:28.630 回答