Typescript: Uitvoering van interface in de aannemer mogelijk?

stemmen
4

Ik heb de volgende interface:

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

En dan wil ik het uit te voeren als een klasse en de eigenschappen wordt ingesteld in de constructor:

  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);
    }
  }

Maar volgens de compiler Request niet implementeren van de interface. Ik begrijp niet hoe werkt het controleren, terwijl het alles heeft ingevuld op basis van de interface aan de bouwfase en als geschreven in JavaScript zou dit werken prima, typecontrole hetzelfde in Sluiting gereedschap werkt ook perfect. Het idee is dat ik wil de interface als een klasse uit te voeren, dus ik nut methoden in het prototype kan hebben, maar nog steeds in staat om gemakkelijk te converteren naar JSON string.

Iemand een idee?

Bedankt

De vraag is gesteld op 08/10/2012 om 12:02
bron van user
In andere talen...                            


1 antwoorden

stemmen
7

De taal dienst zal statisch analyseren van uw verklaring van de interface, en omdat die u kenbaar dat het vereist dat uw headerlid, die deel moeten uitmaken van de klasse verklaring vormen:

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";
    }
}

Maak je geen zorgen, de output javascript is een stuk slanker:

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;
})();
antwoordde op 08/10/2012 om 13:48
bron van user

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