TypeScript, üzerine statik bir tip sistemi eklenmiş JavaScript'tir. Her JavaScript programı geçerli TypeScript sözdizimidir; TypeScript tip notasyonlarını, bunları kod çalışmadan önce kontrol eden bir derleyiciyi ve onları yeniden kaldıran bir derleme adımını ekler. Çalışma zamanında yalnızca JavaScript vardır, yani fark tamamen yayına almadan önce neyi öğrendiğinizdedir.
JavaScript'te aynı fonksiyon, bu koddan type Product = ..., : Product[] ve : number çıkarılmış halidir. Tipler derleyici ve editör için bilgi ekler; programın ne yaptığını değiştirmezler.
Bir Bakışta TypeScript vs JavaScript
| JavaScript | TypeScript | |
|---|---|---|
| Tip sistemi | Dinamik: tipler değerlere aittir ve yalnızca çalışma zamanında bilinir | Statik: tipler bildirilir ya da çıkarılır ve derleme zamanında kontrol edilir |
| Tip hataları ne zaman görünür | Satır çalıştığında (undefined, NaN, TypeError) | Yazarken editörde ve derlediğinizde |
| Nerede çalışır | Tarayıcılar, Node.js, Deno, Bun, doğrudan | Aynı yerler, tipler kaldırıldıktan sonra |
| Derleme adımı | Gerekmez | tsc ya da bir bundler, veya tipleri kendisi silen bir çalışma ortamı |
| Dosyalar | .js, .mjs, .cjs | .ts, .mts, .cts, .tsx, ayrıca .d.ts tip bildirimleri |
| Çalışma hızı | Referans | Aynı: çıktı JavaScript'tir |
| Editör desteği | Çıkarılan tiplerden ve kütüphane tiplerinden otomatik tamamlama, eksik olabilir | Bildirilen tiplerden otomatik tamamlama, yeniden adlandırma ve "tüm referansları bul" |
| Öğrenme eğrisi | Daha düşük | JavaScript artı tip sistemi |
| Standart | TC39 tarafından ECMAScript | ECMAScript'i takip eden bir Microsoft açık kaynak projesi |
Aynı Kod İki Dilde
İşte JavaScript'te bir fonksiyon. İçinde user nesnesinin nasıl görünmesi gerektiğini söyleyen hiçbir şey yok:
function greeting(user) {
return `Hello, ${user.firstName} ${user.lastName}`;
}
greeting({ firstname: "Ada", lastName: "Lovelace" });
// "Hello, undefined Lovelace", no error anywhere
TypeScript sürümü biçimi bir kez belirtir ve yazım hatası kod çalışmadan önce bildirilir:
interface User {
firstName: string;
lastName: string;
}
function greeting(user: User): string {
return `Hello, ${user.firstName} ${user.lastName}`;
}
greeting({ firstname: "Ada", lastName: "Lovelace" });
// error TS2561: Object literal may only specify known properties,
// but 'firstname' does not exist in type 'User'. Did you mean to write 'firstName'?
Sözdizimindeki farkın tamamı notasyonlardır. TypeScript kendine ait birkaç bildirim de ekler (interface, type, enum, Array<string> gibi generic'ler, private gibi erişim belirleyiciler), ama ifadeler, operatörler ve yerleşik nesneler JavaScript'e aittir.
TypeScript'in Yakalayıp JavaScript'in Yakalamadıkları
JavaScript tipleri sessizce dönüştürür. Bu hata, her zaman string olan form alanlarından gelen değerlerde sık görülür. Derleyicinin ne dediğini görmek için çalıştırın:
index.ts(7,17): error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'number[]'.
Type 'string' is not assignable to type 'number'.
JavaScript'te bu kod çalışır ve 010205 yazdırır, çünkü 0 + "10" string birleştirmesidir. TypeScript, string'ler dönüştürülene kadar derlemeyi reddeder; örneğin fromForm.map(Number) ile.
Diğer büyük kategori eksik olabilecek değerlerdir. Array.prototype.find hiçbir şey eşleşmediğinde undefined döndürür ve TypeScript sizi bununla ilgilenmeye zorlar:
index.ts(8,13): error TS18048: 'user' is possibly 'undefined'.
Düz JavaScript sürümü çalışma zamanında TypeError: Cannot read properties of undefined (reading 'name') ile çöker. TypeScript'teki çözüm, derleyicinin gösterdiği durumu ele almaktır:
Çıktı:
GRACE
no user with id 3
TypeScript'in yakalamadıkları: mantık hataları (yanlış bir formülün tipi doğrudur) ve programa çalışma zamanında giren verilerle ilgili her şey. User olarak tiplenmiş bir API yanıtı, onu gönderen sunucu kadar doğrudur, çünkü kod çalıştığında tipler artık yoktur. Bu tür verileri çalışma zamanı koduyla kontrol edin.
TypeScript'te JavaScript Kütüphaneleri Kullanmak
Çıktı zaten JavaScript olduğu için her npm paketi TypeScript'ten çalışır. Bir paketin tipleri şu üç yerden birinden gelir:
- Paket kendi
.d.tsdosyalarıyla gelir. Aktif bakımı yapılan paketlerin çoğu böyledir ve ekstra bir şey kurmazsınız. - Topluluğun DefinitelyTyped projesinden ayrı bir
@typespaketi:npm install --save-dev @types/lodashkomutulodashiçin tipleri ekler. - Hiçbir yerden. Bu durumda
strictaçıkken import'un kendisi bir hatadır:
error TS7016: Could not find a declaration file for module 'lodash'. '/project/node_modules/lodash/lodash.js' implicitly has an 'any' type.
Try `npm i --save-dev @types/lodash` if it exists or add a new declaration (.d.ts) file containing `declare module 'lodash';`
Çözüm, varsa @types paketini kurmak ya da modülü bir .d.ts dosyasında kendiniz tanımlamaktır; declaration files sayfası nasıl yapılacağını gösteriyor.
Derleme Adımı
Tarayıcılar ve Node.js tip kontrolü yapmaz, bu yüzden TypeScript'in kaynak kodunuz ile çalışan kod arasında bir adıma ihtiyacı vardır. Yaygın üç kurulum vardır:
tscher şeyi derler. Tipleri kontrol eder ve.jsdosyalarını genellikle birdistklasörüne yazar. Basittir ve kütüphaneler için standarttır.- Bir bundler ya da geliştirme sunucusu tipleri kaldırır,
tsc --noEmitise kontrol eder. Vite ve esbuild tipleri kontrol etmeden siler, bu da yeniden yüklemeleri hızlı tutar; tip denetleyicisini editör ve bir CI adımı çalıştırır. - Çalışma ortamı tipleri kaldırır. Güncel Node.js sürümleri, Deno ve Bun
.tsdosyalarını doğrudan çalıştırır. Hiçbiri çalışırken tip kontrolü yapmaz, bu yüzden tip hatalarını bulmanın yolu yinetsc --noEmit(veyadeno check) komutudur.
JavaScript'in bunların hiçbirine ihtiyacı yoktur ve küçük betikler için en büyük pratik avantajı budur. TypeScript adımının maliyeti çoğunlukla kurulumdur (bir tsconfig.json ve bir typescript geliştirme bağımlılığı) ve derleme süresidir; TypeScript 7'nin yerel derleyicisi bu süreyi büyük projelerde yaklaşık on kat kısalttı.
Öğrenme Eğrisi
JavaScript hakkında bildiğiniz her şey geçerliliğini korur, çünkü TypeScript'in çalışma zamanı JavaScript'tir. Yeni olan tip sistemidir ve katmanlar halinde gelir:
- Değişkenler, parametreler ve dönüş değerleri üzerindeki notasyonlar (
: string,: number[]). interfacevetypeile nesne tipleri, opsiyonel özellikler,string | numbergibi union'lar.- Daraltma: bir değeri
typeof,inveya===ile kontrol ederek derleyicinin hangi durumda olduğunuzu bilmesini sağlamak. - Generic'ler,
Partial<T>vePick<T, K>gibi utility tipler ve kütüphane yazarları için ileri düzey tipler.
İlk iki katman uygulama kodunun çoğunu kapsar. Tiplerin büyük kısmı çıkarıldığı için çoğu TypeScript kodu, yalnızca fonksiyon imzalarında notasyon bulunan JavaScript gibi görünür.
TypeScript mi, JavaScript mi?
TypeScript, JavaScript'ten daha mı iyi? Birkaç kişinin bakımını yaptığı ya da yıllarca yaşayan kod için genellikle evet ve sektör de bu yöne gitti: GitHub'ın aylık katkıda bulunan sayısına göre TypeScript, Ağustos 2025'te hem JavaScript'i hem Python'u geçerek GitHub'da en çok kullanılan dil oldu. Küçük betikler için düz JavaScript çoğu zaman daha iyi bir araçtır.
TypeScript seçin, eğer:
- Kod üzerinde birden fazla kişi çalışıyorsa veya aylarca ya da yıllarca bakımı yapılacaksa.
- Kod tabanı, her fonksiyon imzasını aklınızda tutamayacağınız kadar büyükse.
- Sık sık yeniden düzenleme yapıyorsanız: bir özelliği yeniden adlandırmak her kullanımını günceller ve derleyici geride kalanları listeler.
- Bir kütüphane yayınlıyorsanız:
.d.tsdosyaları kullanıcılarına otomatik tamamlama ve kontrol sağlar. - Framework bunu bekliyorsa. Angular uygulamaları TypeScript ile yazılır, Next.js ve Astro yeni projeleri varsayılan olarak TypeScript ile oluşturur ve Vite'ın React, Vue ve Svelte şablonlarının her birinin bir TypeScript varyantı vardır.
JavaScript seçin, eğer:
- Program kısa bir betik, tek seferlik bir deneme ya da tarayıcı konsolunda bir kod parçasıysa.
- Programlamayı ilk kez öğreniyorsanız ve aynı anda daha az kavramla uğraşmak istiyorsanız.
- Bir derleme adımı yoksa ve istemiyorsanız. Bu durumda bile, düz bir
.jsdosyasında JSDoc ile birlikte// @ts-checksize bir miktar kontrol sağlar.
Bir JavaScript Projesini TypeScript'e Taşımak
Taşıma tek seferde yapılmak zorunda değildir. Derleyici TypeScript'in yanında JavaScript'i de kabul eder:
{
"compilerOptions": {
"allowJs": true,
"checkJs": false,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
allowJs ile .js dosyaları derlenir ve .ts dosyalarından import yapabilir, tersi de mümkündür. Sonra adım adım dönüştürün:
- Bir dosyanın uzantısını
.jsyerine.tsyapın ve derleyicinin o dosyada bildirdiği hataları düzeltin. - Uç noktalardan (az import içeren yardımcı modüllerden) başlayın, sonra içeriye doğru ilerleyin.
- Henüz adını değiştirmediğiniz dosyaları kontrol etmek için
checkJsseçeneğini açın ya da tek tek.jsdosyalarının en üstüne// @ts-checkekleyin.
Kontrol edilen JavaScript dosyalarında tipleri JSDoc yorumları sağlar:
// @ts-check
/**
* @param {number} price
* @param {number} qty
* @returns {number}
*/
function lineTotal(price, qty) {
return price * qty;
}
lineTotal("3", 2);
// error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
Bazı ekipler burada durur: JSDoc tipleri olan, tsc tarafından kontrol edilen JavaScript dosyaları ve kodun kendisi için derleme adımı yok. Diğerleri sonuna kadar .ts'ye geçer. Mevcut bir projede strict seçeneğini açarsanız başta çok sayıda hata bekleyin; strict mode sayfası her bayrağın neyi kontrol ettiğini listeler, böylece onları birer birer açabilirsiniz.
Sıkça Sorulan Sorular
TypeScript ile JavaScript arasındaki temel fark nedir?
TypeScript, JavaScript'e statik tipler ekler. Her değerin ne olduğunu tanımlarsınız (name: string, items: Item[]) ve TypeScript derleyicisi hataları kod çalışmadan önce bildirir. JavaScript önceden hiçbir şeyi kontrol etmez: yanlış bir tip ancak o satır çalıştığında ortaya çıkar, çoğu zaman undefined ya da bir TypeError olarak.
TypeScript, JavaScript'ten daha mı iyi?
Birden fazla kişinin bakımını yaptığı ya da birkaç haftadan uzun yaşayan projelerin çoğu için evet: tipler bütün hata sınıflarını yakalar, yeniden düzenlemeyi (refactoring) güvenli hale getirir ve editörün otomatik tamamlamasını besler. Kısa bir betik, hızlı bir prototip ya da bir öğrenme alıştırması için düz JavaScript'le başlamak daha hızlıdır ve derleme kurulumu gerektirmez.
TypeScript, JavaScript'ten daha mı hızlı?
Hayır, daha yavaş da değil. TypeScript JavaScript'e derlenir ve tipler silinir, yani çalışan kod elle yazacağınız JavaScript'in aynısıdır. Tek ek maliyet geliştirme sırasındaki derleme süresidir.
Önce JavaScript mi, TypeScript mi öğrenmeliyim?
JavaScript temellerini önce ya da TypeScript ile birlikte öğrenin. Çalışma zamanındaki tüm davranış (değişkenler, fonksiyonlar, nesneler, diziler, promise'ler) JavaScript'tir ve TypeScript yalnızca bunu tanımlar. Küçük JavaScript programları yazabildiğinizde tip eklemek kısa bir adımdır.
TypeScript ve JavaScript'i aynı projede kullanabilir miyim?
Evet. tsconfig.json içinde "allowJs": true ayarlayın, derleyici .ts dosyalarının yanında .js dosyalarını da kabul eder. JSDoc yorumlarındaki tipleri kullanarak JavaScript dosyalarını da kontrol etmek için "checkJs": true (ya da dosya başına bir // @ts-check yorumu) ekleyin. Bir projeyi dosya dosya taşımanın alışılmış yolu budur.