Wat is het verschil tussen “verklaren class” en “interface” met de schrijfmachine

In typoscript, bij het maken van .d.ts bron verklaring bestanden, die de voorkeur en waarom?

declare class Example {
    public Method(): void; 
}

of

interface Example {
    Method(): void;
}

De verschillen die ik kan zeggen is dat interfaces kan geen statische methoden, dus je een klasse moet gebruiken voor. Beide niet product geen JS-uitgang, dus misschien het maakt niet uit?


Antwoord 1, Autoriteit 100%

interfaceis voor als je gewoon wilt de vorm van een object te beschrijven. Er is geen code generatie, ooit, voor interfaces – ze zijn slechts een artefact in het type systeem. U zult geen verschil in de code generatie te zien voor een klasse, afhankelijk van het al dan niet heeft een implementsclausule.

declare classis voor als je wilt beschrijven een bestaande klasse (meestal een typoscript klasse, maar niet altijd) dat gaat extern aanwezig te zijn (bijvoorbeeld heb je twee Ts bestanden die compile twee Js bestanden en beide zijn opgenomen via script-tags in een webpagina). Als u erven van een classmet extends(ongeacht of het basistype was een declare classof een gewone class) de compiler gaat om alle code te genereren voor het aansluiten van het prototype keten en doorsturen constructeurs en wat niet.

Als u probeert te erven van een declare classdie een interface moeten zijn, je gaat naar een runtime error, omdat dat gegenereerde code zal worden verwezen naar een object zonder runtime manifestatie.

Omgekeerd, als je gewoon implementeen interface die een declare classmoeten zijn, je gaat te hebben re-uitvoering van alle leden zelf en won’ t te maken van een code hergebruik van de zogenaamde basisklasse en functies die de prototypeketen controleren bij uitvoering zal het object verwerpen niet daadwerkelijk een instantie van de basisklasse.

Om echt nerdy te krijgen, als je een C++ achtergrond, kun je grofweg denken aan interfaceen typedefen declare classals een externverklaring van een constructor die strikt mist de definities van deze compilatie apparaat.

Vanuit een pure consumptie kant (het schrijven van imperatieve code, niet het toevoegen van nieuwe types), het enige verschil tussen interfaceen declare classis dat je niet kunt neween interface. Echter, als u van plan bent om extend/ implementeen van deze vormen in een nieuw class, u absoluut moet correct te hebben gekozen tussen interfaceen declare class. Slechts één van hen zal werken.

twee regels die u goed zal dienen:

  • Is de naam van het uitlijnen met een constructorfunctie (iets invokable met new) dat is eigenlijk aanwezig zijn op runtime (bijvoorbeeld Dateis, maar JQueryStaticis niet)? Als geen , die u zeker wilt interface
  • Ben ik te maken met een gecompileerde klasse uit een ander logbestand, of iets voldoende vergelijkbaar? Als ja , gebruik declare class

Antwoord 2, Autoriteit 15%

U kunt de interface uit te voeren:

class MyClass implements Example {
    Method() {
    }
}

Overwegende dat de declare classsyntax is echt bedoeld om te worden gebruikt om typedefinities externe code die niet met de schrijfmachine wordt geschreven toe te voegen -., Zodat de uitvoering is “elders”


Antwoord 3, Autoriteit 8%

In lekentaal wordt declaregebruikt in .ts/d.tsbestanden om de compiler te vertellen dat we het sleutelwoord kunnen verwachten dat we ‘re declaringom in die omgeving te bestaan, zelfs als het niet is gedefinieerd in het huidige bestand. Dit stelt ons dan in staat om typeveiligheid te hebben bij het gebruik van het gedeclareerde object, omdat de Typescript-compiler nu weet dat een ander onderdeel die variabele kan bieden.


Antwoord 4, autoriteit 4%

Verschil tussen declareen interfacein TS:

verklaar:

declare class Example {
    public Method(): void; 
}

In de bovenstaande code laat declarede TS-compiler weten dat ergens de klasse Exampleis gedeclareerd. Dit betekent niet dat de klas op magische wijze is inbegrepen. Jij als programmeur bent er verantwoordelijk voor dat de klasse beschikbaar is wanneer je deze declareert (met het trefwoord declare).

interface:

interface Example {
    Method(): void;
}

Een interfaceis een virtuele constructie die alleen in typoscript bestaat. De typoscript-compiler gebruikt het uitsluitend voor typecontrole. Wanneer de code naar javascript wordt gecompileerd, wordt deze hele constructie verwijderd. De typoscript-compiler gebruikt interfaces om te controleren of objecten de juiste structuur hebben.

Bijvoorbeeld als we de volgende interface hebben:

interface test {
  foo: number,
  bar: string,
}

De objecten die we definiëren en die dit type interface hebben, moeten exact overeenkomen met de interface:

// perfect match has all the properties with the right types, TS compiler will not complain.
  const obj1: test = {   
    foo: 5,
    bar: 'hey',
  }

Other episodes