javascript - d.ts dosyası ile nodejs require aynı isimle kullanıldığında çoğul tanımlayıcı hatası
Şimdi sorunun, içinde "Shared" adlı bir modül bulunan bir d.ts dosyası dahil edildiği ve bir NodeJS ortamında kullanılıyorsa aynı adda bir değişkeni içeren bir require ifadesi olduğu için kaynaklandığından eminim.
// shared.d.ts
declare module Shared { ... }
// other_module.ts
/// <reference path="shared.d.ts"/>
if(require) { var Shared = require("shared"); }
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
Yani other_module.ts (aslında birçok ayrı dosya) derlediğimde, Shared'in yinelenen bir tanımlayıcı olduğunu söylüyor, bunu anlayabiliyorum çünkü TS Shared'in bir modül olduğunu düşünüyor, ama sonra ona require'in dönüşü olduğu söyleniyor.
Buradaki sorun, modüllerin çıktısının nodeJS'in require sistemiyle uyumlu olması gerektiğidir, bu nedenle bu durumda other_module gerekli olduğunda kendi kapsamı içinde olacak ve Shared.SomethingElse hakkında bilgisi olmayacaktır, bu yüzden require gereklidir ki other_module içindeki dahili modüller Shared kütüphanesine erişebilsin, ancak tarayıcı ortamında Shared.SomethingElse global kapsam aracılığıyla elde edilecektir.
Eğer referansı kaldırırsam dosya derlenmez çünkü Shared hakkında bir bilgisi yok, eğer modül nodejs'e yüklendiğinde require'ı kaldırırsam (var otherModule=require("other_module")) Shared hakkında bir bilgisi olmadığını söyleyerek hata verir. Peki bunun bir çözümü var mı?
Cevap #1
Önce hata
Çifte tanımlayıcı, çünkü shared.d.ts içinde Shared ve other_module.ts içinde var.
DÜZELT A, tamamen harici ol
Eğer amd/commonjs yani dış modüller kullanmak istiyorsanız, import/require kullanmanız gerekir (tıpkı şu anda yaptığınız gibi var/require değil). Bir import kullanmak, yeni bir değişken deklarasyon alanı oluşturur ve bu nedenle artık global isim alanını Shared 'i other_module.ts üzerinden kirletmiyorsunuz. Kısaca :
// shared.d.ts
declare module Shared {
export function SomethingElse(arg:string):any;
}
declare module 'shared'{
export = Shared;
}
Ve tür güvenli bir ithalat:
// other_module.ts
/// <reference path="shared.d.ts"/>
import Shared = require("shared");
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
B'yi düzelt, eski halinle devam et, ama sonra farklı bir isim kullanman gerekiyor
other_module içinde, eğer yerel kapsam küresel kapsam ise Shared adını yerel olarak kullanmayın. Ben her yerde sadece external kullanmanızı ve node için commonjs ile tarayıcı için amd olarak derlemenizi tavsiye ederim, tıpkı düzeltme A'da gösterildiği gibi, ama eğer zorunluysa işte derlenmiş sabitlenmiş other_module.ts.
// other_module.ts
/// <reference path="shared.d.ts"/>
var fooShared: typeof Shared;
if(require) { fooShared = require("shared"); }
else { fooShared = Shared; }
export class Something {
public someVar = new fooShared.SomethingElse("blah");
}
