2015-08-13 18 views
20

ile kullanmak Büyük ölçekli bir kodlama projesi üzerinde çalışmaya başladım.Birden çok dosyaya yayılmış isim alanını TypeScript

En baştan beri dosyalarımı düzenli tutmak istiyorum (bu proje çok fazla geliştirici arasında bölünecek, dolayısıyla sipariş çok gerekli).

Modüller/ad alanları ve sınıfları her biri için ayrı dosyalara ayırmaya ve ad alanını tutan bir klasöre sahip olmaya çalışıyorum.

dosya yapısı şöyledir:

app.ts 
    \Classes 
    ---- \Animals 
    ---- ---- Mammals.ts 
    ---- ---- Reptiles.ts 

Sonra gibi bir şey kullanarak app.ts bu ad alanındaki tüm dosyaları alma girişiminde: namespace dosyalarının kendilerini gelince import * as Animals from "./Classes/Animals"

, ben denedim hiçbir başarı ile şu:

namespace Animals { 
    export class Mammals { 
     constructor() { 
     } 
    } 
} 

ve ayrıca:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Ne yazık ki, yol hiçbir zaman tanınmadı (tek bir dosya değil, bir klasöre işaret ettiğinden). Bu mümkün mü? Tüm sınıflarımın bir dosyadaki tek bir ad alanından elde edilmesi, binlerce satır uzunluğunda olan dosyalara ve bu projenin sürdürülemez olmasına neden olacaktır.

Ayrıca, TypeScript 1.5'in tsconfig.json desteğine sahip olduğunu da fark ettim - ancak her bir dosyayı el ile haritaya eklemek zorunda olmak, dev'ler sınıfları eklemeye başladığında sorunları tanıtmanın kesin bir yoludur.

Not: Visual Studio 2015, TypeScript 1.5 kullanıyorum (Eminim nasıl doğrulayacağından emin değilim). Ayrıca ES6 desteği açık.

Verebileceğiniz herhangi bir tavsiye için teşekkürler!

+0

resmi el kitabı (ut eski olabilir rağmen) – pablochan

+0

Teşekkür @pablochan http://www.typescriptlang.org/Handbook#modules-splitting-across-files bu kapakları . Ad alanı içindeki her dosyaya başvurmak, sezgiseldir. Bireysel dosyalar yerine isim alanına işaret etmek mümkün mü? – Askanison4

+0

Hayır, Visual Studio veya başka bir araç bunu desteklemediği sürece. – pablochan

cevap

16

Harici bir modül oluşturmak için yeniden dışa aktarma özelliğini kullanın. şapka grupları ve diğer modüllerden türlerini ortaya çıkarır:

// Classes/Animals.ts 
export * from '.\Animals\Mammals'; 
export * from '.\Animals\Reptiles'; 

Sonra her zamanki gibi yeni modülünden türlerini ithal: hedefinize ulaşmak için

// app.ts 
import * as Animals from '.\Classes\Animals' 

let dog: Animals.Dog; 
let snake: Animals.Snake; 

Ya

// app.ts 
import { Dog, Snake } from '.\Classes\Animals' 

let dog: Dog; 
let snake: Snake; 
+0

Çok teşekkür ederim, bu kusursuz çalışıyor – Laker

+0

Bu işe yaramıyor mu? Tam olarak yapmak istediğim şey bu, ama ben de "... Memeliler.ts bir modül değil " – DanielC

0

Harici modüller, modüller dosyasını dosyaya yüklediğinizi belirtir. Hem AMD hem de CommonJS'in isim alanı yok. Dosyaları bir modülde paketlemek için bir tür postprocessing kullanabilirsiniz.

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Bunun için import kullanmamalısınız:


şu dahili modülü tanımlar. Animals.Reptiles her yerde görülebilir. Tek amaç, komut dizilerini uygun sıraya (örneğin, miras öncesi temel sınıflara) yüklemektir. Yani tüm dosyaları ts.config veya başka bir yerde listelemelisiniz. Projemde klasörlerdeki paketleri kullanıyorum ve temel sınıfların dosya isimlerine @ eklemek için bir sözleşmem var.

Başka bir çözüm, harici modülleri kullanmaktır: AMD (RequireJS) veya CommonJS (Browserify). Bu durumda, üst düzey module bildirgesinden kaldırın.

import Reptilies = require('..\Animals\Reptilies') 
var reptile = new Reptile(); 

Ya yeni ES6 modülleri ile:

class Reptiles { 
    constructor() { 
    } 
} 

export = Reptiles; 

dosya yoluna göre modülünü başvurabilirsiniz:

export class Reptiles { 
    constructor() { 
    } 
} 

bir dosya yalnızca türü içeriyorsa, bir kökü olarak dışa aktarabilirsiniz
import { Reptiles } from '..\Animals\Reptilies'; 
+0

Bu durumda, Hayvanlar ad alanını nasıl içe aktarırım? Eğer 20 sınıflı bir ismim varsa (hepsi kullanılacak), bir referans isteyebilirim. En azından diğer dillerdeki durum budur. Ayrıca, ES 6 desteğiyle 'export = Sürüngenler; 'kodunun yükseltilemediği için cesaretin kırıldığını fark ettim. – Askanison4

4

Bulunan Bir bakıma ama ad alanı anahtar kelimesiyle değil.

  1. "Hayvanlar" sınıfları, ad altında Animal.ts & Mammal.ts & Reptile.ts. Varil için index.ts ile
  2. . Ad alanı gruplaması için
  3. animals.ts.

Animal namespace

Örnek sınıfları:

Classes

(ad gruplandırma için)

enter image description here

animals.ts

(namlu gibi)

index.ts

enter image description here

Ve burada ad alanı kavramına giriyorsunuz. Ben, şunu da görmüş -

enter image description here

+0

benim için bu doğru cevap oldu, variller var şimdi çok düzeyli ad alanlarına sahip olabilirsiniz, api.Animals.Dog gibi bir şey arıyordu ve bu bana sahip olsun, ancak Bu yaklaşımda "namespace" anahtar sözcüğünü kullanmanın bir yolu olsaydı bile daha güzeldi –

İlgili konular