Dizgi: İçe aktarma ifadesi modül dışında kullanılamaz


19

Düğüm js (07.10.19 için node.js'nin en son sürümü) uygulamasında, varsayılan dışa aktarmadan düğüm modülünü içe aktarırken bir .ts dosyası var. Bu inşaat kullanın: import { Class } from 'abc';i kodu çalıştırdığınızda, ben bu hata var: Cannot use import statement outside a module.

Ağda bu sorun için birçok çözüm görüyorum (.js için), ama bana yardımcı olmaz, belki ben daktilo dosyası olduğundan. İşte benim kod:

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

İşte benim tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}

Bunu bir tarayıcıda mı çalıştırıyorsunuz? İfade importdosyanızdaki ilk satır mı?
Evert

1
Tsconfig.json dosyanızı gönderebilir misiniz? Typcript'te derlediğinizde, hangi tür modülleri ürettiğini belirleyebilirsiniz ve geçerli türler hangi ortama (tarayıcı / NodeJS) ve kullandığınız diğer modülleri ( requirevs import) bağlı olarak değişebilir . Sadece bunun ne kadar karmaşık olduğuna dair bir fikir vermek için Node, vs ve bunların birlikte nasıl çalışılacağı hakkında bazı belgelere sahiptir . importrequire
Jeff Bowman

1
module.exportsSözdizimi kullanıyorsanız , muhtemelen bir ES6 modülünde değilsinizdir.
Bergi

Evert, bu düğüm js uygulaması, tsconfig yakında eklenecek
Zerumi

Tamam, ben gereksinimi kullanamıyorum çünkü inşaat kullanırken 'abc' ad alanı bulunamıyorexecute(a : abc.Class...
Zerumi

Yanıtlar:


5

Ekleme “type”: “module”package.json için hatanın kurtulmak gerektiğini ES2015 modülleri kullanıyorsanız, ama o zaman ayarlayarak Bu tür bir modül oluşturmak için typescript söylemek gerekir Düğüm söyleyecektir “module”: “es2015”yerine “commonjs”tsconfig.json içinde.

Ancak bu, geçerli kodla ilgili bir soruna neden olur, çünkü bir ES6 import {}ifadesi kullanmanıza rağmen commonJS module.exports = {}sözdizimini kullanarak dışa aktarıyorsunuz ve Node'un ES modülü yükleyicisiyle ilgili bir sorun olacaktır. Bununla başa çıkmanın iki yolu vardır:

  1. Tutun module.exportsama tarafından commonJS olarak bu dosyayı yorumlamak Düğüm söyle bunu bir .cjs uzantısı vererek .
  2. Verme ifadesini ES2015 sözdizimi ile değiştirin: export function execute(…)..

İlk seçenek biraz zor olabilir çünkü derleyici .js dosyaları çıktılar ve her zaman (bildiğim kadarıyla) .cjs olarak değiştirmeniz gerekir. İkinci seçenekle, dosyayı Düğüm ile çalıştırabilmeniz gerekir (<13.8 sürümleri için --experimental - modüller bayrağı dahil).

Kesinlikle commonJS kullanmanız gerekiyorsa, belki de Node: @ types / node için tür tanımlarını yüklemek ve içe aktarmayı commonJS biçimine değiştirmek: require('abc')ve ayarların geri kalanını olduğu gibi tutmak daha iyidir (“type” ekleyebilirsiniz) : “Commonjs” den package.json için açık).


1
Sınıf .ts tanımlarında (a: Class gibi) kullanılamaz ... .cjs uzantısı hakkında ... Türler yalnızca .ts dosyalarında olabilir ... ES2015 de benim seçimim değil çünkü kullanıyorum eski ithalat (gerektirir) ile her yerde bu modülleri ... JSDoc kullanarak bu sorunu çözdü. Ama cevap için teşekkürler
Zerumi
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.