Por que o Typescript usa a palavra-chave "export" para tornar públicas as classes e interfaces?

136

Enquanto brincava com o Typecript, percebi que minhas classes nos módulos (usadas como namespaces) não estavam disponíveis para outras classes, a menos que eu escrevesse a exportpalavra-chave antes delas, como:

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

Então agora eu posso usar o código acima desta maneira:

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

No entanto, eu estava me perguntando por que essa palavra-chave é usada, em vez de apenas usar a publicpalavra - chave usada no nível do método para indicar que um método ou propriedade deve ser acessível externamente. Então, por que não usar esse mesmo mecanismo para tornar visíveis externamente classes e interfaces etc.?

Isso daria código resultante como:

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

Respostas:

176

O principal motivo é que exportcorresponde aos planos para ECMAScript. Você poderia argumentar que "eles deveriam ter usado" export "em vez de" public ", mas além de" export / private / protected "ser um conjunto de modificadores de acesso pouco compatível, acredito que haja uma diferença sutil entre os dois que explica isso .

No TypeScript, marcar um membro da classe como publicou privatenão afeta o JavaScript gerado. É simplesmente uma ferramenta de tempo de design / compilação que você pode usar para impedir que seu código TypeScript acesse coisas que não deveria.

Com a exportpalavra - chave, o JavaScript adiciona uma linha para adicionar o item exportado ao módulo. No seu exemplo: here.SomeClass = SomeClass;.

Portanto, conceitualmente, a visibilidade é controlada por publice privateé apenas para ferramentas, enquanto a exportpalavra - chave altera a saída.

Fenton
fonte
1
Obrigado pela informação, presumo que a decisão foi a que você diz para evitar ter que verificar o contexto da palavra-chave, o que é uma pena, pois parece algo que vai atrapalhar algumas pessoas e realmente não tem diferença lógica de comportamento. como você espera que o público aja, apenas facilita sua implementação.
Grofit #
Obrigado por isso. Salva-me o cabelo puxando.
Kent Aguilar
1
É necessário se você estiver usando módulos. Se o aplicativo estiver voltado para o lado maior, os módulos normalmente são uma escolha melhor do que criar grandes pacotes / carregar todos os seus arquivos antecipadamente.
Fenton
@Fenton Você não quis dizer "você poderia argumentar que eles deveriam ter usado 'public' em vez de 'export' '?"
Alan Evangelista
@AlanEvangelista, você certamente poderia argumentar dessa maneira, especialmente se o seu plano de fundo fosse Java / C # e não JavaScript.
Fenton
49

Algumas coisas a acrescentar à resposta de Steve Fenton:

  • export significa duas coisas diferentes (dependendo se é de nível superior ou não); fazendo com que isso signifique que um terço é provavelmente pior do que adicionar public/private
  • Definitivamente, não é para facilitar a implementação; a complexidade adicional de publicvs exporté trivial. Já alteramos muitas palavras-chave; não é difícil.
  • A visibilidade padrão dos membros da classe deve ser pública para se alinhar à proposta de classe ES6, portanto, precisamos de alguma palavra-chave para indicar "não público". Não existe um antônimo adequado para export( unexport??), assim privatecomo a escolha lógica. Uma vez que você tenha private, seria um pouco insano não escolher publiccomo sua contraparte
  • O uso de exportpara modificar a visibilidade nos módulos internos é o alinhamento de melhor palpite com os módulos ES6
Ryan Cavanaugh
fonte
1
obrigado pelas informações adicionais, concordo plenamente com o público / privado no nível de membro, apenas achei estranho não ser suficiente para todos os níveis de acesso. No entanto, esta é uma opinião pessoal e uma palavra-chave é uma palavra-chave, só queria saber mais.
Grofit
5
I redigir minha declaração atrevida sobre a facilidade de implementação e oferecem uma +1 como um pedido de desculpas :)
Fenton
2
Concordo com o que você está dizendo, mas não concordo com a afirmação "Não há um antônimo adequado para exportar" - "import" é o antônimo e é o que o TypeScript usa quando você define uma classe exportável. importá-lo para outros arquivos export class User { name: string } outro arquivo: import {User} from ""./the_file_path_to_the_user_class; ver secção 3.3 dos docs nativescript aqui docs.nativescript.org/angular/tutorial/ng-chapter-3
Adam Diament
3
Como o uso importpara indicar "esse valor não é exportado " seria um uso adequado da palavra-chave?
Ryan Cavanaugh 06/06
5
"Não existe um antônimo adequado para exportar (não exportado ??)" - um antônimo adequado para exportação deve ser um embargo.
rsp