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%
interface
is 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 implements
clausule.
declare class
is 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 class
met extends
(ongeacht of het basistype was een declare class
of 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 class
die 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 implement
een interface die een declare class
moeten 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 interface
en typedef
en declare class
als een extern
verklaring 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 interface
en declare class
is dat je niet kunt new
een interface. Echter, als u van plan bent om extend
/ implement
een van deze vormen in een nieuw class
, u absoluut moet correct te hebben gekozen tussen interface
en 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 (bijvoorbeeldDate
is, maarJQueryStatic
is niet)? Als geen , die u zeker wiltinterface
- 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 class
syntax 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 declare
gebruikt in .ts
/d.ts
bestanden om de compiler te vertellen dat we het sleutelwoord kunnen verwachten dat we ‘re declaring
om 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 declare
en interface
in TS:
verklaar:
declare class Example {
public Method(): void;
}
In de bovenstaande code laat declare
de TS-compiler weten dat ergens de klasse Example
is 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 interface
is 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',
}