Perché Typescript usa la parola chiave "export" per rendere pubbliche le classi e le interfacce?


136

Mentre mi dilettavo con Typescript mi ​​sono reso conto che le mie classi all'interno dei moduli (usate come spazi dei nomi) non erano disponibili per altre classi a meno che non avessi scritto la exportparola chiave prima di loro, come:

module some.namespace.here
{
   export class SomeClass{..}
}

Quindi ora posso usare il codice sopra in questo modo:

var someVar = new some.namespace.here.SomeClass();

Tuttavia, mi stavo solo chiedendo perché questa parola chiave sia utilizzata anziché usare la publicparola chiave utilizzata a livello di metodo per indicare che un metodo o una proprietà dovrebbe essere accessibile esternamente. Quindi perché non usare questo stesso meccanismo per rendere le classi, le interfacce ecc. Visibili esternamente?

Ciò darebbe il codice risultante come:

module some.namespace.here
{
   public class SomeClass{..}
}

Risposte:


176

Il motivo principale è che exportcorrisponde ai piani per ECMAScript. Si potrebbe sostenere che "avrebbero dovuto usare" export "anziché" public ", ma a parte" export / private / protetto "essendo un insieme scarsamente abbinato di modificatori di accesso, credo che ci sia una sottile differenza tra i due che spiega questo .

In TypeScript, contrassegnare un membro della classe come publico privatenon ha alcun effetto sul JavaScript generato. È semplicemente uno strumento di progettazione / compilazione che puoi usare per impedire al tuo codice TypeScript di accedere a cose che non dovrebbe.

Con la exportparola chiave, JavaScript aggiunge una riga per aggiungere l'elemento esportato al modulo. Nel tuo esempio: here.SomeClass = SomeClass;.

Concettualmente, la visibilità è controllata da publiced privateè solo per gli strumenti, mentre la exportparola chiave cambia l'output.


1
Grazie per l'informazione, presumo che la decisione sia stata come dici tu per evitare di dover controllare il contesto della parola chiave, il che è un peccato perché sembra che sia qualcosa che farà inciampare alcune persone e in realtà non ha alcuna differenza logica nel comportamento a come ti aspetti che il pubblico agisca, semplifica semplicemente la loro implementazione.
Grofit

Grazie per questo. Mi fa risparmiare i capelli.
Kent Aguilar,

1
È necessario se si utilizzano moduli. Se l'app è rivolta al lato più grande, i moduli sono in genere una scelta migliore rispetto alla creazione di grandi pacchetti / caricamento di tutti i file in primo piano.
Fenton,

@Fenton Non volevi dire "avresti potuto sostenere che avrebbero dovuto usare" pubblico "anziché" esportazione "?
Alan Evangelista,

@AlanEvangelista potresti sicuramente discuterne in questo modo, specialmente se il tuo background era Java / C # piuttosto che JavaScript.
Fenton,

49

Alcune cose da aggiungere alla risposta di Steve Fenton:

  • export significa già due cose diverse (a seconda che sia al livello più alto o meno); fare in modo che un terzo sia probabilmente peggio che aggiungere public/private
  • Non è sicuramente per rendere più semplice l'implementazione; la complessità aggiunta di publicvs exportè banale. Abbiamo già cambiato le parole chiave in un gruppo; non è difficile.
  • La visibilità predefinita dei membri della classe deve essere pubblica per allinearla con la proposta di classe ES6, pertanto abbiamo bisogno di alcune parole chiave per indicare "non pubblico". Non c'è un antonimo adatto a export( unexport??), quindi privateè la scelta logica. Una volta che hai private, sarebbe un po 'folle non scegliere publiccome controparte
  • L'uso di exportper modificare la visibilità nei moduli interni è l'allineamento migliore con i moduli ES6

1
grazie per le informazioni aggiuntive, concordo pienamente con l'essere pubblico / privato a livello di membro, ho appena trovato strano non essere sufficiente per tutti i livelli di accesso. Tuttavia questa è un'opinione personale e una parola chiave è una parola chiave, volevo solo saperne di più.
Grofit

5
Rifaccio la mia dichiarazione sfacciata sulla facilità di implementazione e offro un +1 come scusa :)
Fenton

2
Sono d'accordo con alcune delle cose che stai dicendo, ma non sono d'accordo con l'affermazione "Non esiste un antonimo adatto per esportare" - "import" è l'antonimo, ed è ciò che TypeScript usa, quando definisci una classe esportabile, allora importalo in altri file export class User { name: string } Un altro file: import {User} from ""./the_file_path_to_the_user_class; vedi la sezione 3.3 dei documenti nativescript
Adam Diament

3
In che modo l'utilizzo importper indicare "questo valore non viene esportato " sarebbe un uso appropriato della parola chiave?
Ryan Cavanaugh,

5
"Non esiste un antonimo adatto per esportare (unexport ??)" - un antonimo adatto per l'esportazione dovrebbe essere l'embargo.
rsp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.