Машинопись: Реализация интерфейса в конструкторе возможно?

голоса
4

У меня есть следующий интерфейс:

interface SMJSPacket {
  header: {
    tag: string;
    method: string;
    type: string;
  };
  response?: {
    status: string;
    content: string;
  };
  event?: {
    key?: string;
    action?: string;
  };
  request?: {
    run?: string;
  };
}

И тогда я хочу, чтобы реализовать его как класс и свойства создаются в конструкторе:

  class Request implements SMJSPacket {
    constructor(data: any, method: string) {
      this.header = {
        type: 'request',
        method: method || 'calld',
        tag: Request.getTag()
      }
      this.request = data;
    }
    static getTag(): string {
      return '_' + goog.now() + '_' + utils.getRandomBetween(1, 1000);
    }
  }

Однако в соответствии с запросом компилятор не реализует интерфейс. Я не понимаю, как это проверить его, в то время как он все заполнены в соответствии с интерфейсом на этапе строительства, и если написано в JavaScript, это будет работать отлично, тип проверки то же самое в Closure инструментов также отлично работает. Идея заключается в том, что я хочу, чтобы реализовать интерфейс как класс, так что я могу иметь вспомогательные методы в прототипе, но все еще быть в состоянии легко преобразовать в JSON строку.

Есть идеи?

благодаря

Задан 08/10/2012 в 12:02
источник пользователем
На других языках...                            


1 ответов

голоса
7

Служба языка будет статический анализировать декларацию своего интерфейса, и потому , что вы высказали , что он требует , чтобы ваш headerчлен, который должен стать частью декларации класса:

class Request implements SMJSPacket {
    header: { tag: string; method: string; type: string; };

    constructor(data: any, method: string) {
        this.header = {
            type: "request",
            method: (method || "calld"),
            tag: Request.getTag()
        };
    }

    static getTag(): string {
        return "tag stuff";
    }
}

Не волнуйтесь, выход браузер намного компактнее:

var Request = (function () {
    function Request(data, method) {
        this.header = {
            type: "request",
            method: (method || "calld"),
            tag: Request.getTag()
        };
    }
    Request.getTag = function getTag() {
        return "tag stuff";
    }
    return Request;
})();
Ответил 08/10/2012 в 13:48
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more