Menu

TypeScript vs JavaScript: Farkları ve Örnekler

TypeScript, kod çalışmadan önce kontrol edilen statik bir tip sistemi eklenmiş JavaScript'tir. İkisini yan yana karşılaştırın: sözdizimi, tip denetleyicisinin yakaladıkları, derleme adımı, çalışma hızı, öğrenme eğrisi ve bir JavaScript projesinin nasıl taşınacağı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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

JavaScriptTypeScript
Tip sistemiDinamik: tipler değerlere aittir ve yalnızca çalışma zamanında bilinirStatik: tipler bildirilir ya da çıkarılır ve derleme zamanında kontrol edilir
Tip hataları ne zaman görünürSatır çalıştığında (undefined, NaN, TypeError)Yazarken editörde ve derlediğinizde
Nerede çalışırTarayıcılar, Node.js, Deno, Bun, doğrudanAynı yerler, tipler kaldırıldıktan sonra
Derleme adımıGerekmeztsc 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ıReferansAynı: çıktı JavaScript'tir
Editör desteğiÇıkarılan tiplerden ve kütüphane tiplerinden otomatik tamamlama, eksik olabilirBildirilen tiplerden otomatik tamamlama, yeniden adlandırma ve "tüm referansları bul"
Öğrenme eğrisiDaha düşükJavaScript artı tip sistemi
StandartTC39 tarafından ECMAScriptECMAScript'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.ts dosyaları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 @types paketi: npm install --save-dev @types/lodash komutu lodash için tipleri ekler.
  • Hiçbir yerden. Bu durumda strict açı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:

  • tsc her şeyi derler. Tipleri kontrol eder ve .js dosyalarını genellikle bir dist klasörüne yazar. Basittir ve kütüphaneler için standarttır.
  • Bir bundler ya da geliştirme sunucusu tipleri kaldırır, tsc --noEmit ise 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 .ts dosyalarını doğrudan çalıştırır. Hiçbiri çalışırken tip kontrolü yapmaz, bu yüzden tip hatalarını bulmanın yolu yine tsc --noEmit (veya deno 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:

  1. Değişkenler, parametreler ve dönüş değerleri üzerindeki notasyonlar (: string, : number[]).
  2. interface ve type ile nesne tipleri, opsiyonel özellikler, string | number gibi union'lar.
  3. Daraltma: bir değeri typeof, in veya === ile kontrol ederek derleyicinin hangi durumda olduğunuzu bilmesini sağlamak.
  4. Generic'ler, Partial<T> ve Pick<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.ts dosyaları 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 .js dosyasında JSDoc ile birlikte // @ts-check size 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:

  1. Bir dosyanın uzantısını .js yerine .ts yapın ve derleyicinin o dosyada bildirdiği hataları düzeltin.
  2. Uç noktalardan (az import içeren yardımcı modüllerden) başlayın, sonra içeriye doğru ilerleyin.
  3. Henüz adını değiştirmediğiniz dosyaları kontrol etmek için checkJs seçeneğini açın ya da tek tek .js dosyalarının en üstüne // @ts-check ekleyin.

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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA