Neden --isolatedModules hatası herhangi bir içe aktarımla düzeltildi?


133

Create-react-app typcript projesinde, bazı şeyleri hızlı bir şekilde test etmek için bunu yazmaya çalıştım:

// experiment.test.ts
it('experiment', () => {
  console.log('test');
});

Ama bana altında dalgalı bir kırmızı ile şu hatayı veriyor it:

'--İsolatedModules' bayrağı sağlandığında tüm dosyalar modül olmalıdır.

Ancak, dosyayı şu şekilde değiştirirsem, görünüşe göre her şey yolunda demektir (elbette kullanılmayan içe aktarma hariç):

// experiment.test.ts
import { Component} from 'react'; // literally anything, don't even have to use it

it('test', () => {
  console.log('test');
});

Neden? Burada ne oluyor? --isolatedModulesAslında ne anlama geliyor / ne yapıyor?


importVeya kullanıyorsanız exportbu dosya bir ES6 modülüdür. Çünkü üst örneği problemlidir itİçe gerekiyordu modüler mimaride, her yerde tanımlanmamış itbir yerden
apokryfos

Yanıtlar:


249

Typescript, dosyaları içe / dışa aktarmadan eski komut dosyası dosyaları olarak ele alır. Bu tür dosyalar modüller ve herhangi bir tanım olmadıklarından genel ad alanında birleştirilirler. isolatedModulesbu tür dosyaları yasaklar.

Bir dosyaya herhangi bir içe veya dışa aktarma eklemek, onu bir modül haline getirir ve hata kaybolur.

Ayrıca export {}, bir dosyayı hiçbir şey içe aktarmadan modül haline getirmenin kullanışlı bir yoludur .


Teşekkürler, çok kolay, ancak ilk testinizi oluşturduğunuzda hatayla kafanız karışıyor.
Juangui Jordán

1
@ JuanguiJordán çok kolay çok yanlış. Eğer istemiyorsanız, isolatedModulessadece ayarlayın false.
Wojciech Bednarski

Teşekkürler @WojciechBednarski ama cevabınızı biraz detaylandırabilir misiniz?
Juangui Jordán

1
@ JuanguiJordán Bir kural eklemek ve sonra ekleyerek onu görmezden gelmek gibidir @ts-ignore. Bu export {}sadece farklı bir sözdizimidir, kuralı atlamanın bir yoludur, ancak prensipte tam olarak budur.
Wojciech Bednarski

1
Her zaman% 99 oranında takip edilen ancak bazen çiğnenmesi gereken genel kurallara sahip olmakla ilgili bir sorun görmüyorum. Kural genellikle iyi olduğu sürece "bir kuralı çiğnemek" zorunda kalmak, beni ne yaptığımı düşünmeye ve bir şeyi çözmenin daha iyi yolları olup olmadığını düşünmeye zorluyor. Ve bazen yoktur. Bu durumda olduğu gibi, bir şeyi denemek için bir test dosyası hazırladığım yer.
Svish

19

Doğru yol, TypeScript'e ne istediğinizi söylemektir. isolatedModulesDizininizin tsconfig.jsoniçinde oluşturmak istemiyorsanız testve ekleyin:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "isolatedModules": false
  },
}

"isolatedModules": trueYapılandırmaya eklemek ve ardından TypeScript denetleyicisini boş export {}kokular ekleyerek aldatmak bana kötü kodlar veriyor.


isolutedModules kural gelen kısmen bazı dosya dışlamak için başka yol olmadığı için diğer açıklamalarda belirtildiği gibi, bu özel durumda, bu kod koku olarak sayılmayacaktır, bu bir zorunluluk, üzerinde burada
Akshay Vijay Jain

Hmm, yanlışa doğru olduğunu düşündüğümde, yanıt olarak bana söylendi: TypeError: DoğrulaTypeScriptSetup'da '# <Nesne>' nesnesinin salt okunur 'yalıtılmışModülleri' özelliğine atanamıyor
Jerry Asher

@JerryAsher burada adamım, ama daha önce çalıştı ve sonra bazı kodları geri aldım ve çalıştırmayı denedim, ki bu da aynı hatayı aldığım zamandı.
Ganesh Kumar

1

İzole modülleri kontrol etmeye çalışalım. Google'ı kontrol ettiğimde, bunun doğrudan bir bağlamı yok.

Temel olarak Typescript'in modülleri tek başına derlemesine izin verdiğiniz anlamına gelir.

Ama Typescript'ten geliyor ve Typescript'in isim alanlarına tercih ettiği modüller ile bir ilgisi var.

Modüller ayrıca bir modül yükleyiciye (CommonJs / Require.js gibi) veya ES Modüllerini destekleyen bir çalışma zamanına bağımlıdır. Modüller daha iyi kod yeniden kullanımı, daha güçlü izolasyon ve gruplama için daha iyi araç desteği sağlar.

Kaynak 1

Bir create-react-app typescript projesi kullanarak, typecript ve ts-jest'i yüklemiş olmanız gerekir (veya create-react-app, uygulamayı çıkarıp çıkarmamanıza bağlı olarak bağımlılıkları işlemelidir).

Ayrıca ts-jestbununla ilgili bazı bilgiler var:

Varsayılan olarak ts-jest, tam tip denetimi ve özelliklerle bir proje (sizin) bağlamında TypeScript derleyicisini kullanır. Ancak , TypeScript'in 'yalıtılmış modül' dediği her dosyayı ayrı ayrı derlemek için de kullanılabilir . IsolatedModules seçeneği (varsayılan olarak false olan) bunu yapar.

Kaynak 2

exportKomutu kullanır kullanmaz, dışa aktarılanlardan bir modül oluşturuyorsunuz.

Eğer ts-jest kullanıyorsanız, bu ayarları diğer modüllerinizi etkilemeden ekleyebilirsiniz, bu da create-react-app içerecektir.

"ts-jest": {
  "isolatedModules": false
}

Profesyoneller ve eksiler için ts-jest sayfasını (ikinci kaynak) kontrol edin.

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.