【问题标题】:Creating APIs with nested class methods (Typescript)使用嵌套类方法创建 API (Typescript)
【发布时间】:2019-06-01 14:56:12
【问题描述】:

我正在尝试创建一个包装 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

【问题讨论】:

    标签: typescript nested typescript-class


    【解决方案1】:

    我认为要完全按照说明实现您的要求,您应该使用arrow functions,以便apiService.mediaapiService.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
    

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

    Link to code

    【讨论】:

    • 谢谢,它可以工作,但也有缺点——嵌套方法失去了智能感知和附加信息,一方面代码更具表现力,另一方面不太清晰......
    • “嵌套方法失去了智能”这对我来说是个新闻。你能证明这一点吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多