Typescript sınıfları ve arayüzleri herkese açık hale getirmek için neden "dışa aktar" anahtar kelimesini kullanıyor?


136

Typecript ile uğraşırken, modüller içindeki sınıflarımın (ad alanları olarak kullanılır), exportanahtar kelimeyi onlardan önce yazmadığım sürece diğer sınıflar tarafından kullanılamayacağını fark ettim , örneğin:

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

Yani şimdi yukarıdaki kodu şu şekilde kullanabilirim:

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

Bununla birlikte public, bir yöntemin veya özelliğin dışarıdan erişilebilir olması gerektiğini belirtmek için yalnızca yöntem düzeyinde kullanılan anahtar sözcüğü kullanmak yerine bu anahtar kelimenin neden kullanıldığını merak ediyordum . Öyleyse neden sınıfları ve arayüzleri vb. Dışarıdan görünür kılmak için aynı mekanizmayı kullanmıyorsunuz?

Bu, aşağıdaki gibi sonuç kodu verir:

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

Yanıtlar:


177

Birincil neden, exportECMAScript planlarıyla eşleşmesidir. "Genel" yerine "dışa aktarma" kullanmaları gerektiğini iddia edebilirsiniz, ancak "dışa aktar / özel / korumalı" erişim değiştiricilerinin yetersiz eşleşmiş bir dizi olmasının yanı sıra, ikisi arasında bunu açıklayan ince bir fark olduğuna inanıyorum .

Daktilo gibi bir sınıf üyesi işaretleme publicveya privateoluşturulan JavaScript üzerinde hiçbir etkisi yoktur. Bu, TypeScript kodunuzun erişmemesi gereken şeylere erişmesini durdurmak için kullanabileceğiniz bir tasarım / derleme zamanı aracıdır.

İle exportanahtar kelime, JavaScript modülüne ihraç öğe eklemek için bir çizgi ekler. Sizin örnekte: here.SomeClass = SomeClass;.

Dolayısıyla kavramsal olarak, görünürlük sadece araçlarla kontrol edilir publicve privatesadece araç kullanımı içindir, oysa exportanahtar kelime çıktıyı değiştirir.


1
Bilgi için teşekkürler, kararın sizin söylediğiniz gibi anahtar kelimenin bağlamını kontrol etmekten kaçınmak olduğunu varsayıyorum, bu utanç verici çünkü birkaç kişiyi ayağa kaldıracak bir şey gibi geliyor ve gerçekten mantıksal bir davranış farkı yok halkın nasıl davranmasını beklediğinize göre, bunların uygulanmasını kolaylaştırır.
Grofit

Bunun için teşekkürler. Beni saç çekmekten kurtarır.
Kent Aguilar

1
Modülleri kullanıyorsanız gereklidir. Uygulamanız daha büyük taraftaysa, modüller genellikle büyük paketler oluşturmaktan / tüm dosyalarınızı önden yüklemekten daha iyi bir seçimdir.
Fenton

@Fenton "İhracat" yerine "genel" kullanmaları gerektiğini iddia edebilir miydiniz?
Alan Evangelista

@AlanEvangelista, özellikle de arka planınız JavaScript yerine Java / C # ise, kesinlikle bu şekilde tartışabilirsiniz.
Fenton

49

Steve Fenton'ın cevabına eklenecek birkaç şey:

  • export halihazırda iki farklı anlama gelir (en üst seviyede olup olmamasına bağlı olarak); üçüncü bir eklemekten daha muhtemelen daha kötü olduğu anlamına yapma public/private
  • Kesinlikle uygulamayı kolaylaştırmak değil; ilave karmaşıklığı publicVS exportbasittir. Bir grupta anahtar kelimeleri zaten değiştirdik; zor değil.
  • Sınıf üyelerinin varsayılan görünürlüğü , ES6 sınıf teklifiyle uyumlu olması için herkese açık olmalıdır , bu nedenle "genel değil" i belirtmek için bazı anahtar sözcüklere ihtiyacımız var. export( unexport??) için uygun bir zıtlık yoktur private, mantıksal seçim de öyle. Bir kez sahip olduğunuzda private, publicmuadili olarak seçmemek biraz çılgınca olurdu.
  • exportDahili modüllerde görünürlüğü değiştirmek için kullanımı, ES6 modülleri ile en iyi tahmin uyumudur

1
ek bilgiler için teşekkürler, kamu / özelin üye seviyesinde olmasına tamamen katılıyorum, sadece tüm erişim seviyeleri için yeterli olmamasını garip buldum. Ancak bu kişisel bir görüş ve bir anahtar kelime bir anahtar kelimedir, sadece daha fazlasını öğrenmek istedim.
Grofit

5
Uygulama kolaylığıyla ilgili arsız ifademi yeniden
Fenton

2
Söylediklerinizden bazılarına katılıyorum, ancak "Dışa aktarılacak uygun bir zıtlık yok" ifadesine katılmıyorum - "içe aktarma" zıttı ve TypeScript'in kullandığı şey bu, dışa aktarılabilir bir sınıf tanımladığınızda, o zaman siz başka dosyalara aktarın export class User { name: string } Başka bir dosya: import {User} from ""./the_file_path_to_the_user_class; burada nativescript
Adam Diament

3
import"Bu değerin dışa aktarılmadığını " belirtmek nasıl anahtar kelimenin uygun bir kullanımı olur?
Ryan Cavanaugh

5
"Dışa aktarılacak uygun bir zıtlık yok (aktarılmayan ??)" - dışa aktarım için uygun bir zıtlık ambargo olmalıdır.
rsp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.