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で記述されている場合は正常に機能しますが、クロージャーツールで同じことをタイプチェックすることも完全に機能します。プロトタイプにユーティリティメソッドを含めることができ、それでもJSON文字列に簡単に変換できるように、インターフェイスをクラスとして実装するという考え方です。

何か案は?

ありがとう

4

1 に答える 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";
    }
}

心配しないでください、出力javascriptははるかにスリムです:

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;
})();
于 2012-10-08T12:48:04.977 に答える