Yanıtlar:
aradığım şeyi buldum:
Deklare ve var
varyeni bir değişken oluşturur. declareTypeScript'e değişkenin başka bir yerde oluşturulduğunu söylemek için kullanılır. Eğer kullanırsanız declare, hiçbir şey oluşturulur JavaScript eklenir - bu sadece derleyiciye bir ipucu olduğunu.
Örneğin, tanımlayan harici bir komut dosyası var externalModulekullanırsanız , önceden ayarlanmış declare var externalModuleolan TypeScript derleyicisine ipucu vermek için kullanılır .externalModule
externalModuleDiğerleri arasında bir değişken tanımlayan harici bir JS ile benzer bir senaryo var . Çalışma externalModulezamanında tanımlanmamış olmasının nedeni diğer değişkenlerin bazılarının olmamasının nedeni ne olabilir ?
Bunu anlamak için önce "declare" anahtar kelimesini anlamalısınız.
İşte Gil Fink'in Blogundan iyi bir açıklama :
TypeScript declare anahtar sözcüğü, bir TypeScript dosyasından kaynaklanmayan değişkenleri bildirmek için kullanılır.
Örneğin, myLibrary adında bir TypeScript bildirim dosyasına sahip olmayan ve global ad alanında myLibrary adında bir ad alanına sahip bir kütüphanemiz olduğunu düşünelim. Bu kitaplığı TypeScript kodunuzda kullanmak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:
declare var myLibrary;TypeScript çalışma zamanının myLibrary değişkenine vereceği tür herhangi bir türdür. Buradaki sorun, tasarım süresinde bu değişken için Intellisense'e sahip olmamanız, ancak kodunuzda kitaplığı kullanabilmenizdir. Declare anahtar sözcüğünü kullanmadan aynı davranışa sahip olmanın başka bir seçeneği de, herhangi bir türde bir değişken kullanmaktır:
var myLibrary: any;Kod örneklerinin her ikisi de aynı JavaScript çıktısıyla sonuçlanır, ancak bildirim örneği daha okunabilir ve ortam bildirimini ifade eder.
Dolayısıyla "declare" anahtar kelimesini anladıktan sonra, bulduğunuz yere geri dönün.
export declare class Action{
...
}
Sınıfın gerçek uygulaması muhtemelen başka bir yerde olabilir - belki bir .js dosyası.
declare var myLibraryhiçbir şeye aktarılamaz: typescriptlang.org/play/#code/…
declare daktilo ile:declareDaktilo anahtar bir o typescript derleyici bildirmek için faydalıdır beyan (yere zamanı ortamına harici JavaScript dosyası veya kısmen yazılmış) başka bir yerde tanımlanır.
Diyelim ki başka bir yerde bildirilen foo adında bir değişkenimiz var. Daha sonra değişkene başvurmaya çalıştığımızda, typescript derleyicisi bir hata atar:
foo = 'random'; // Error: 'foo' is not defined
Bu sorunu declareanahtar kelimeyi kullanarak çözebiliriz :
declare var foo: string;
foo = 'random'; // no error anymore
Bunun aşağıdaki sonuçları vardır:
fooaslında başka bir yerde ilan ve biz bir çalışma zamanı hatası oluşabilir değişkeni kullanmayı deneyin değildir. Bu yüzden sadecedeclareAnahtar kelimeyi değişkenin bu noktada kullanılabilir olduğunu biliyorsanız .Beyan bu özel durumda anahtar kelime:
export declare class Actions {
...
}
... görünüşe göre yararsızdır ve bence TypeScript bunu bir hata yapmayı düşünmelidir (gizli bir neden olup olmadığını bilmiyorum). Bir sınıf bildirirseniz, onu asla içe aktarmanız gerekmez. Birinin onu içe aktarmasını bekleyen bir sınıfı dışa aktarırsanız, bildirmeniz gerekmez. Ve bu sınıfı tanımladığınız için, tanım gereği, bu sınıf, içe aktarmaya gerek kalmadan kullanılabilir olmalıdır. Ancak, bir sınıf bildirdiğinizde bu doğru değildir . Sen ihtiyaç kullanmak için ithal etmek.
TL; DR
export declare class Actions {
...
}
aynıdır
declare class Actions {
...
}
import, ikincisi değil
declare - herhangi bir içe veya dışa aktarma anahtar kelimesi olmadan - eski modüllere (TypeScript tanımları olmayan npm yüklü paketler) yazım eklemek için kullanışlı bir özellik olan TypeScript tarafından otomatik olarak seçilen bildirim dosyalarını tanımlar.
import/ exportmodülleri kullanmanın doğru yoludur ve her şeyin manüel olarak içe aktarılması gerekir (ve biraz sıkıcı buluyorum), ya mantık, ya da tanımlar.
Pratik bir kullanım örneği olarak, export declaretüm alt öğeleri dışa aktarmaktan kaçınmanıza izin verir, örneğin:
export declare namespace Redux {
namespace Store {
interface Definition { ... }
}
}
Okumak daha kolay olabilir:
export namespace Redux {
export namespace Store {
export interface Definition { ... }
}
}
Harici içe aktarma her iki durumda da aynıdır (ör. import { Redux } from 'definitions/redux'; ), iyi bir uygulama olup olmadığını bilmiyorum, ama düzenli buluyorum! ^^
Dosyanıza bir importveya eklemenin exportonu modül olarak tanıtacağını ve bu nedenle declarekapsamın artık küresel düzeyde olmayacağını akılda tutmak önemlidir .
PS, bir hata var ( sorun 16671 ): const enumbeyanınızda kullanırsanız (bunu redux eylemleri türü için yaparım) ve transpileOnlybayrağı belirttiyseniz ( create-tepki-uygulama-daktilo paketi yapar, bu yüzden biliyorum), enum sıralı olmayacak! İçinde koşabilirsiniz, olmayabilir, ama önceden bilmek yararlıdır!
export namespaceolan iyi bir fikir değildir ve eklemek gereksiz Namespacing . İlgili olarak export declare, André Pena'nın cevabına bir göz atın.