- Konu sahibi
- #1
İlk olarak hata mesajındaki modül yolunun türünü ayırın:
Önce hata mesajındaki import ifadesini ve dosyanın gerçek konumunu karşılaştırın. Örneğin
Hata şu biçimdeyse paket adı bulunamıyordur:
Projenin
Burada
Komutu başka bir klasörde çalıştırırsanız paket farklı bir
Kurulumdan sonra hata hâlâ görünüyorsa şu iki sonucu birbirinden ayırın:
Görülen durum | Anlamı | Sonraki işlem
Paket var, fakat türleri bulunamıyor | Paket tür bilgisi sağlamıyor veya tür paketi eksik | Paket belgelerine göre yerleşik tür desteğini ya da ilgili
Paket var, alt yol bulunamıyor | Alt yol paket tarafından dışa aktarılmamış olabilir | Paketin desteklediği giriş noktasını kullanın;
TypeScript geçiyor, uygulama çalışırken hata veriyor | TypeScript ile çalışma zamanı aynı yolu çözümlemiyor | Bundler, Node.js veya çalışma komutunun alias ayarlarını TypeScript ile eşleştirin
Tablodaki son iki durum önemlidir: TypeScript’in importu tanıması, JavaScript çalışma zamanının aynı importu yükleyebildiğini tek başına kanıtlamaz.
Şu import, paketin ana giriş noktası yerine belirli bir alt yolunu çağırır:
Paketin
Bu durumda yapılacak doğru işlem, paketin desteklediği herkese açık import yolunu kullanmaktır. Örneğin paket şu girişi yayımlıyorsa:
Şu tür importlar özel yol eşlemesi kullanır:
TypeScript’in bu yolu anlayabilmesi için
Bu ayar,
Alias kullanan projede şu sırayla ilerleyin:
Projeniz Node.js üzerinde çalışıyor ve
Örneğin NodeNext kullanan bir projede temel yapılandırma şu biçimde olabilir:
Bu örnek, her proje için otomatik olarak doğru yapılandırma değildir. Bundler kullanan bir uygulamada
Sorun görünürde doğruysa çözümleme izini açın:
Çıktıda hata veren importun ardından TypeScript’in denediği yolları inceleyin. Örneğin
İz çıktısının sonunda yalnızca “modül bulunamadı” yazması çözüm değildir; hata veren import satırına ait ilk başarısız aramayı bulun. Böylece dosya yolu, paket kurulumu,
Şu tür bir bildirim bazı durumlarda TypeScript’in tür hatasını geçici olarak susturur:
Fakat bu satır paketi kurmaz, yanlış import yolunu düzeltmez ve çalışma zamanında modülü yüklemez. Yalnızca modülün türlerini
Şu sırayı izlemek, derleme ile çalışma zamanı sorunlarını birbirine karıştırmanızı önler:
./ veya ../ ile başlayan yol yanlış dosya konumuna, paket adıyla başlayan yol eksik/yanlış kuruluma ya da paket dışa aktarımına, @/... gibi özel bir takma ad ise tsconfig.json ile çalışma zamanının uyuşmamasına işaret eder. Dosya adını ve büyük-küçük harfleri düzeltin, gerekli paketi projenin kök dizininde kurun, tsconfig.json içindeki modül çözümleme ayarlarını kullandığınız çalışma ortamına göre düzenleyin ve ardından npx tsc --noEmit komutuyla sonucu kontrol edin. Hata devam ederse --traceResolution çıktısı TypeScript’in hangi yolları denediğini gösterir.Hata hangi import satırında oluşuyor?
Önce hata mesajındaki import ifadesini ve dosyanın gerçek konumunu karşılaştırın. Örneğin
src/index.ts içinden src/utils/logger.ts dosyasını çağırıyorsanız doğru göreli yol şudur:
Kod:
import { logger } from "./utils/logger";
index.ts dosyası src/components klasöründeyse aynı dosyaya ulaşmak için yol bir üst dizine çıkmalıdır:
Kod:
import { logger } from "../utils/logger";
Cannot find module './utils/logger' hatası bu durumda çoğunlukla dosyanın yanlış klasörde aranması anlamına gelir. Dosya gerçekten mevcut olsa bile şu ayrıntıları da kontrol edin:- Dosya adındaki büyük-küçük harfler import ile aynı mı?
Logger.tsilelogger.ts, büyük-küçük harfe duyarlı sistemlerde farklı dosyalardır. - Dosya uzantısı gerçekten
.ts,.tsx,.js,.mtsveya.ctsmi? - Import satırındaki göreli yol, import yapan dosyaya göre mi yazıldı?
- Dosya,
excludeveya yanlış birrootDirayarı nedeniyle derleme kapsamının dışında mı?
moduleResolution ayarı; importların Node.js, bundler veya eski Node kurallarına göre nasıl aranacağını belirler. node16, nodenext ve bundler farklı çözümleme kuralları kullanır; bu nedenle yalnızca hata mesajını susturmak için rastgele bir değer seçmek doğru değildir.Paket bulunamıyorsa kurulumu ve paket adını düzeltin
Hata şu biçimdeyse paket adı bulunamıyordur:
Kod:
import express from "express";
import { z } from "zod";
Projenin
package.json dosyasının bulunduğu kök dizinde paketin gerçekten kurulu olduğunu kontrol edin:
Bash:
npm install express zod
npm install -D @types/express
npx tsc --noEmit
Burada
express ve zod çalışma zamanında kullanılan paketlerdir. @types/express ise TypeScript’in Express için tür bilgilerini bulmasına yarar. Her paket için ayrıca @types paketi gerekmez; paket kendi türlerini içeriyorsa ikinci bir paket kurmak gereksizdir. Paket adının npm’deki gerçek adıyla import satırındaki adın aynı olduğundan da emin olun.Komutu başka bir klasörde çalıştırırsanız paket farklı bir
node_modules dizinine kurulabilir. Bu nedenle önce çalışma dizinini, package.json dosyasının yerini ve kullanılan paket yöneticisini doğrulayın. npm install, pnpm install veya yarn install komutlarından birini, projede zaten kullanılan paket yöneticisinin kilit dosyasına göre kullanın; aynı projede paket yöneticilerini karıştırmak çözümleme sorunlarını artırabilir.Kurulumdan sonra hata hâlâ görünüyorsa şu iki sonucu birbirinden ayırın:
Görülen durum | Anlamı | Sonraki işlem
node_modules içinde paket yok | Paket kurulmamış veya yanlış klasöre kurulmuş | Proje kökünde paketi kurun; package.json ve kilit dosyasını kontrol edinPaket var, fakat türleri bulunamıyor | Paket tür bilgisi sağlamıyor veya tür paketi eksik | Paket belgelerine göre yerleşik tür desteğini ya da ilgili
@types paketini kontrol edinPaket var, alt yol bulunamıyor | Alt yol paket tarafından dışa aktarılmamış olabilir | Paketin desteklediği giriş noktasını kullanın;
package.json içindeki exports kuralını inceleyinTypeScript geçiyor, uygulama çalışırken hata veriyor | TypeScript ile çalışma zamanı aynı yolu çözümlemiyor | Bundler, Node.js veya çalışma komutunun alias ayarlarını TypeScript ile eşleştirin
Tablodaki son iki durum önemlidir: TypeScript’in importu tanıması, JavaScript çalışma zamanının aynı importu yükleyebildiğini tek başına kanıtlamaz.
Paket var ama alt modül bulunamıyorsa
Şu import, paketin ana giriş noktası yerine belirli bir alt yolunu çağırır:
Kod:
import helper from "some-package/internal/helper";
Paketin
package.json dosyasında exports alanı varsa yalnızca açıkça dışa aktarılan yollar kullanılabilir. Node.js belgelerine göre exports alanı tanımlandığında paketin izin verilmeyen alt yollarına erişim engellenebilir; main alanı bulunsa bile exports önceliklidir.Bu durumda yapılacak doğru işlem, paketin desteklediği herkese açık import yolunu kullanmaktır. Örneğin paket şu girişi yayımlıyorsa:
JSON:
{
"exports": {
".": "./dist/index.js",
"./utils": "./dist/utils.js"
}
}
some-package/internal/helper yerine yalnızca paketin yayımladığı some-package veya some-package/utils yolu kullanılabilir. node_modules içindeki dosyanın doğrudan yolunu import etmek geçici olarak çalışsa bile paket güncellendiğinde bozulabilir; bu, kalıcı çözüm değildir.@/ veya başka bir alias kullanıyorsanız
Şu tür importlar özel yol eşlemesi kullanır:
Kod:
import Button from "@/components/Button";
TypeScript’in bu yolu anlayabilmesi için
tsconfig.json içinde paths tanımlanabilir:
JSON:
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"paths": {
"@/*": ["./src/*"]
}
}
}
Bu ayar,
@/components/Button yolunu TypeScript’in tür denetimi sırasında src/components/Button ile eşlemesine yardım eder. Ancak paths ayarı derlenmiş JavaScript içindeki import yolunu kendiliğinden değiştirmez. Bu nedenle bundler, test aracı veya Node.js çalıştırıcısı da aynı aliası tanımıyorsa derleme başarılı olsa bile uygulama çalışırken modül bulunamayabilir.Alias kullanan projede şu sırayla ilerleyin:
tsconfig.jsondosyasının gerçekten derlemede kullanılan dosya olduğunu doğrulayın. Monorepo veya farklı scriptlerde başka bir yapılandırma dosyası seçiliyor olabilir.pathsiçindeki hedefin dosyanın gerçek konumuna göre yazıldığını kontrol edin.@/*için./src/*kullanılıyorsa@/components/Button,src/components/Buttonkonumunu arar.- Bundler veya test aracındaki alias eşlemesini aynı hedefe ayarlayın.
- Uygulamayı TypeScript dosyasını doğrudan değil, projenin gerçek derleme/çalıştırma komutuyla başlatın.
- Hem
npx tsc --noEmithem de uygulamanın çalıştırma komutu başarılı oluyorsa çözümleme iki tarafta da eşleşmiş demektir.
paths eklemek, çalışma zamanındaki sorunu çözmez. Sibling paketleri veya monorepo paketlerini elle aliaslamak yerine npm, Yarn ya da pnpm workspaces ile gerçek node_modules bağlantısı oluşturmak çoğu durumda daha tutarlıdır.tsconfig.json ve modül sistemini eşleştirin
Projeniz Node.js üzerinde çalışıyor ve
package.json içinde ES modülü kullanıyorsa module, moduleResolution, dosya uzantıları ve package.json içindeki type alanı birlikte değerlendirilmelidir. Node.js, .mjs, .cjs ve package.json içindeki type değerine göre dosyaları farklı biçimlerde yorumlar.Örneğin NodeNext kullanan bir projede temel yapılandırma şu biçimde olabilir:
JSON:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"rootDir": "src",
"outDir": "dist",
"strict": true
},
"include": ["src/**/*.ts"]
}
Bu örnek, her proje için otomatik olarak doğru yapılandırma değildir. Bundler kullanan bir uygulamada
bundler çözümlemesi, Node.js’in doğrudan çalıştırdığı bir projede ise Node’un kullandığı modül düzeni daha uygun olabilir. Önemli olan tsconfig.json ayarının üretilen JavaScript’i çalıştıracak araçla aynı kuralları izlemesidir. TypeScript belgelerinde bundler çözümlemesinin göreli importlarda uzantı zorunluluğunu Node çözümleme modlarından farklı ele aldığı belirtilir.TypeScript’in gerçekten hangi yolu aradığını görün
Sorun görünürde doğruysa çözümleme izini açın:
Bash:
npx tsc --noEmit --traceResolution
Çıktıda hata veren importun ardından TypeScript’in denediği yolları inceleyin. Örneğin
src/utils/logger.ts yerine src/utils/Logger.ts aranıyorsa sorun dosya adının büyük-küçük harfidir. node_modules/some-package aranıyor fakat dizin yoksa paket kurulumunda sorun vardır. Paket bulunduğu hâlde package.json içindeki exports nedeniyle yol eleniyorsa desteklenmeyen bir alt yol kullanıyorsunuzdur.İz çıktısının sonunda yalnızca “modül bulunamadı” yazması çözüm değildir; hata veren import satırına ait ilk başarısız aramayı bulun. Böylece dosya yolu, paket kurulumu,
paths eşlemesi ve exports kısıtı arasında doğru ayrımı yapabilirsiniz. Değişiklikten sonra aynı komutu yeniden çalıştırın; yeni çıktıda TypeScript’in hedef dosyayı bulduğu görülmeli ve npx tsc --noEmit hata vermemelidir.declare module ile hatayı gizlemeyin
Şu tür bir bildirim bazı durumlarda TypeScript’in tür hatasını geçici olarak susturur:
Kod:
declare module "some-package";
Fakat bu satır paketi kurmaz, yanlış import yolunu düzeltmez ve çalışma zamanında modülü yüklemez. Yalnızca modülün türlerini
any benzeri belirsiz bir biçimde kabul ettirebilir. Paket gerçekten mevcut değilse veya bundler yolu çözemiyorsa uygulama yine çalışmaz. Bu nedenle önce gerçek dosya/paket çözümünü düzeltin; bildirim dosyasını ancak türleri olmayan ve çalışma zamanında gerçekten var olan özel bir modül için, bilinçli bir geçici bildirim olarak kullanın.Düzeltmeden sonra sonucu nasıl doğrulamalısınız?
Şu sırayı izlemek, derleme ile çalışma zamanı sorunlarını birbirine karıştırmanızı önler:
- Dosya importuysa yolu ve dosya adını düzeltin; paket importuysa paketin proje kökünde kurulu olduğunu doğrulayın.
- Alias kullanıyorsanız
tsconfig.json, bundler ve test aracındaki eşlemeleri aynı hedefte birleştirin. - Node.js veya bundler projesine uygun
modulevemoduleResolutiondeğerlerini kullanın. npx tsc --noEmitkomutunu çalıştırın. Hata yoksa TypeScript çözümlemesi başarılıdır.- Uygulamayı gerçek çalıştırma komutuyla başlatın. Burada hata oluşuyorsa sorun artık TypeScript tür çözümlemesinden çok çalışma zamanı, bundler,
exportsveya üretilen JavaScript yolundadır. - Hata devam ederse
npx tsc --noEmit --traceResolutionçıktısında hata veren importun denenen yollarını inceleyin.
tsc başarılı olduğu hâlde uygulama başarısızsa TypeScript’in modülü bulduğunu, fakat çalışma ortamının aynı importu bulamadığını anlarsınız. tsc de başarısızsa önce TypeScript yapılandırması, dosya konumu, paket kurulumu veya paket giriş noktası düzeltilmelidir.