- Konu sahibi
- #1
İlk olarak import yolunun, dışa aktarılan adın ve TypeScript’in kullandığı tsconfig.json dosyasının aynı projeyi gösterdiğini kontrol edin. Dosyalar gerçekten mevcutsa sorun genellikle yanlış göreli yol, export eksikliği, dosya adı büyük-küçük harf uyuşmazlığı, Node.js ile bundler için yanlış moduleResolution seçimi veya yalnızca TypeScript’in bildiği bir paths kısayolunun çalışma zamanında tanınmamasıdır. Hatanın kaynağını kesinleştirmek için önce import satırını basit bir göreli yola indirin; ardından
Dosya bulunuyor olsa bile istediğiniz isim dışa aktarılmamışsa ayrı bir hata alırsınız. Named export ile import biçimi aynı adı kullanmalıdır:
Default export kullanıyorsanız süslü parantez kullanmayın:
Bu ayrım, “modül bulunamadı” ile “modül şu üyeyi export etmiyor” hatalarının farklı olduğunu gösterir. Dosya yolunu düzelttiğiniz hâlde yalnızca export edilen isimle ilgili hata kalıyorsa artık çözümleme değil, export/import biçimi kontrol edilmelidir.
TypeScript modül çözümlemesini, kodun çalışacağı ortama göre yapar. Modern Node.js için
TypeScript, bu kullanımda tür bilgisi için
Proje kökünde, doğru
Çıktıda sorunlu import için “Trying substitution” veya benzeri arama satırlarını izleyin. TypeScript yanlış klasörde arıyorsa göreli yolu ya da çalışma dizinini düzeltin. Dosyayı doğru bulduğu hâlde isim hatası veriyorsa export/import biçimini düzeltin. Hiçbir kaynak dosyayı kapsamıyorsa
Bu kontrollerden sonra TypeScript hata vermiyor, fakat uygulama çalışırken modül bulunamıyorsa sorun TypeScript’te değil, çalışma zamanı veya bundler çözümlemesindedir. Derlenmiş JavaScript içindeki import yolunu,
tsc --traceResolution çıktısında TypeScript’in hangi dosyaları aradığını izleyin.Import yolu dosyanın konumuna göre hesaplanır
./ ve ../ içeren bir import, proje köküne göre değil, import satırının bulunduğu dosyaya göre çözülür. Örneğin şu yapı varsayılsın:
Kod:
proje/
├─ src/
│ ├─ app.ts
│ └─ helpers/
│ └─ format.ts
app.ts içinden format.ts dosyasına ulaşmak için doğru yol şöyledir:
Kod:
// src/app.ts
import { format } from "./helpers/format";
app.ts dosyasından ../helpers/format yazmak, src klasörünün dışına çıkıp orada helpers aratır. Dosya başka bir klasördeyse ./ veya ../ sayısını, import eden dosyanın gerçek konumuna göre düzeltin. Linux gibi büyük-küçük harfe duyarlı sistemlerde ./Helpers/format, ./helpers/format ile aynı kabul edilmez.Kaynak dosya gerçekten export ediyor mu?
Dosya bulunuyor olsa bile istediğiniz isim dışa aktarılmamışsa ayrı bir hata alırsınız. Named export ile import biçimi aynı adı kullanmalıdır:
Kod:
// helpers/format.ts
export function format(value: string): string {
return value.trim();
}
// app.ts
import { format } from "./helpers/format";
Default export kullanıyorsanız süslü parantez kullanmayın:
Kod:
// helpers/format.ts
export default function format(value: string): string {
return value.trim();
}
// app.ts
import format from "./helpers/format";
Bu ayrım, “modül bulunamadı” ile “modül şu üyeyi export etmiyor” hatalarının farklı olduğunu gösterir. Dosya yolunu düzelttiğiniz hâlde yalnızca export edilen isimle ilgili hata kalıyorsa artık çözümleme değil, export/import biçimi kontrol edilmelidir.
tsconfig.json ve çalışma ortamını eşleştirin
TypeScript modül çözümlemesini, kodun çalışacağı ortama göre yapar. Modern Node.js için
node16 veya nodenext, bundler kullanan projeler için bundler tercih edilir. Node.js’in ESM kipinde göreli importlarda çıktı dosyasının uzantısı gerekebilir; kaynak TypeScript dosyası için genellikle .js yazılır:
Kod:
import { format } from "./helpers/format.js";
TypeScript, bu kullanımda tür bilgisi için
format.ts dosyasını bulabilir; oluşturulan JavaScript ise format.js yolunu kullanır. Bundler yapılandırmalarında uzantısız yol desteklenebilir. Bu nedenle aynı import satırının Node.js’te çalışıp bundler yapılandırmasında veya tersinde hata vermesi mümkündür.| Belirti | Muhtemel neden | İlk kontrol |
|---|---|---|
| Cannot find module './x' | Yol, klasör veya dosya adı yanlış | Import eden dosyaya göre gerçek yolu ve harfleri kontrol edin |
| Module has no exported member | İsim export edilmemiş veya import biçimi yanlış | Named ve default export kullanımını karşılaştırın |
| Kısayol importu derleniyor, çalışırken bulunamıyor | paths yalnızca TypeScript’e tanıtılmış | Bundler veya çalışma zamanında aynı alias eşlemesini tanımlayın |
| Node.js ESM uzantı hatası | Göreli importta çıktı uzantısı eksik | module ve moduleResolution ayarlarını birlikte inceleyin |
paths ile @/helpers/format gibi bir kısayol tanımlamak, TypeScript’in dosyayı bulmasına yardım eder; import ifadesini çalışma zamanında kendiliğinden yeniden yazmaz. Bu yüzden bundler, test çalıştırıcısı veya Node.js de aynı alias yapılandırmasını bilmelidir. Aksi durumda tsc başarılı olsa bile uygulama çalışırken modül bulunamayabilir.TypeScript’in ne aradığını doğrudan görün
Proje kökünde, doğru
tsconfig.json dosyasını kullanarak şu komutu çalıştırın:
Bash:
npx tsc --noEmit --traceResolution
Çıktıda sorunlu import için “Trying substitution” veya benzeri arama satırlarını izleyin. TypeScript yanlış klasörde arıyorsa göreli yolu ya da çalışma dizinini düzeltin. Dosyayı doğru bulduğu hâlde isim hatası veriyorsa export/import biçimini düzeltin. Hiçbir kaynak dosyayı kapsamıyorsa
include, exclude veya proje referanslarını kontrol edin; ancak başka bir projenin tsconfig.json dosyasını rastgele kopyalamak yerine derlemeyi gerçekten hangi komutun başlattığını esas alın.Bu kontrollerden sonra TypeScript hata vermiyor, fakat uygulama çalışırken modül bulunamıyorsa sorun TypeScript’te değil, çalışma zamanı veya bundler çözümlemesindedir. Derlenmiş JavaScript içindeki import yolunu,
package.json içindeki type, exports ve kullanılan bundler alias ayarlarıyla birlikte kontrol edin. traceResolution yalnızca TypeScript’in ne aradığını kanıtlar; Node.js’in veya bundler’ın aynı dosyayı çalıştırırken bulacağını tek başına kanıtlamaz.