TypeScript, JavaScript programlarını çalıştırmadan önce denetleyen statik bir tip denetleyicisi ve bu denetim için JavaScript'e tip sözdizimi ekleyen bir dildir. Her geçerli JavaScript sözdizimi TypeScript için de geçerlidir; TypeScript bunun üstüne değerlerin nasıl kullanılabileceğine dair kurallar ekler. Derleme bittiğinde tipler silinir ve ortaya düz JavaScript çıkar.
Kısacası JavaScript ile TypeScript arasındaki fark çalışma zamanında değil, kodu yazdığınız ve derlediğiniz anda ortaya çıkar. Bu yazıda statik tip denetiminin ne anlama geldiğini, tiplerin neden silindiğini, yapısal tiplemeyi ve JavaScript'ten gelenlerin bilmesi gereken farkları örneklerle anlatıyoruz. Örnekler TypeScript 6.0 derleyicisiyle, varsayılan ayarlarla denendi.
Statik tip denetimi ne demek?

Kodu çalıştırmadan hata aramaya statik denetim denir. Bu denetimi değerlerin türüne (tipine) bakarak yapan araca da statik tip denetleyicisi denir. JavaScript'te var olmayan bir özelliğe eriştiğinizde hata almazsınız, sessizce undefined döner ve sorun çok sonra ortaya çıkar. TypeScript aynı kodu derleme sırasında yakalar:
const kutu = { genislik: 10, yukseklik: 15 };
const alan = kutu.genislik * kutu.yuksekilk;
// TS2551: Property 'yuksekilk' does not exist on type
// '{ genislik: number; yukseklik: number; }'. Did you mean 'yukseklik'?JavaScript'te bu satır çalışır ve alan değeri NaN olur. TypeScript ise yazım hatasını görür ve doğru adı önerir. Benzer biçimde, sözdizimi olarak geçerli ama anlamsız işlemleri de reddeder. Örneğin bir sayıyı boş diziye bölmek JavaScript'te Infinity üretir; TypeScript bunu büyük olasılıkla bir hata olarak görür:
console.log(4 / []);
// TS2363: The right-hand side of an arithmetic operation must be of type
// 'any', 'number', 'bigint' or an enum type.Tipler nereden geliyor? Çıkarım ve ek açıklama
TypeScript'in tip bilmesi için her şeye tip yazmanız gerekmez. Bir değişkeni bir değerle başlattığınızda derleyici o değerin tipini değişkene verir; buna tip çıkarımı (inference) denir. Sonradan farklı türde bir değer atamaya çalışırsanız hata alırsınız:
let mesaj = "Merhaba"; // tip: string (çıkarım)
mesaj = 42;
// TS2322: Type 'number' is not assignable to type 'string'.Çıkarımın yetmediği yerlerde, özellikle fonksiyon parametrelerinde, tipi kendiniz yazarsınız. Bu yazım biçimine tip ek açıklaması (type annotation) denir ve her zaman adın arkasına, iki noktadan sonra gelir:
function selamla(kisi: string, tarih: Date) {
console.log(`Merhaba ${kisi}, bugün ${tarih.toDateString()}`);
}
selamla("Ayşe", Date());
// TS2345: Argument of type 'string' is not assignable to parameter of type 'Date'.Bu örnek öğreticidir: JavaScript'te Date() fonksiyon olarak çağrıldığında nesne değil metin döndürür. Doğrusu new Date() kullanmaktır. TypeScript, belgelere bakmadan bu farkı size hatırlatır. Ayrıntılı tip yazımı için temel tipler yazısına bakabilirsiniz.
Tiplerin silinmesi (type erasure)
Tarayıcılar ve Node.js tip ek açıklamalarını anlamaz; bu yüzden TypeScript kodu çalışmadan önce JavaScript'e dönüştürülür. Derleyici denetimi bitirince TypeScript'e özgü sözdizimini kaldırır. Aşağıdaki dosyayı tsc ile derlediğimizde:
function selamla(kisi: string, tarih: Date): string {
return `Merhaba ${kisi}, bugün ${tarih.getFullYear()} yılındayız.`;
}
console.log(selamla("Ayşe", new Date(2026, 10, 5)));TypeScript 6.0 şu JavaScript'i üretti (tsconfig olmadan, varsayılan ayarlarla):
"use strict";
function selamla(kisi, tarih) {
return `Merhaba ${kisi}, bugün ${tarih.getFullYear()} yılındayız.`;
}
console.log(selamla("Ayşe", new Date(2026, 10, 5)));
// Node 24 çıktısı: Merhaba Ayşe, bugün 2026 yılındayız.Parametre ve dönüş tipleri tamamen kayboldu. Bunun önemli bir sonucu var: tipler programın çalışma biçimini değiştirmez. TypeScript ek bir çalışma zamanı kütüphanesi de getirmez; programınız JavaScript'in standart kütüphanesini ve kullandığınız paketleri kullanır. Ayrıca derleme sırasında hata çıksa bile tsc varsayılan olarak JavaScript dosyasını yine üretir; bunu engellemek isterseniz noEmitOnError ayarı vardır (ayrıntısı kurulum ve tsc yazısında).
Silinmeyen istisnalar
Birkaç TypeScript özelliği yalnızca tip değildir, çalışma zamanında kod üretir. En bilineni enum'dur:
enum Yon {
Yukari,
Asagi,
}
console.log(Yon.Asagi); // 1"use strict";
var Yon;
(function (Yon) {
Yon[Yon["Yukari"] = 0] = "Yukari";
Yon[Yon["Asagi"] = 1] = "Asagi";
})(Yon || (Yon = {}));
console.log(Yon.Asagi);TypeScript 5.8 ile gelen erasableSyntaxOnly ayarı, bu tür çalışma zamanı anlamı taşıyan sözdizimini (enum, çalışma zamanı kodu içeren namespace, sınıflardaki parametre özellikleri, import = ve export =) hata olarak işaretler. Aynı enum bu ayarla TS1294: This syntax is not allowed when 'erasableSyntaxOnly' is enabled. hatası verir. Bu ayar, tipleri yalnızca silerek çalışan araçlarla uyum için önemlidir; enum seçenekleri için enum ve alternatifleri yazısına bakın.
Yapısal tipleme: şekil önemlidir
TypeScript'in temel ilkelerinden biri, tip uyumluluğunu adlara göre değil değerlerin şekline göre belirlemesidir. Buna yapısal tipleme ya da "duck typing" denir. Bir nesne, beklenen tipin istediği özelliklerin hepsine sahipse o tipe uyar; nereden geldiği, hangi sınıftan üretildiği önemli değildir:
interface Nokta {
x: number;
y: number;
}
function yazdir(n: Nokta) {
console.log(`${n.x}, ${n.y}`);
}
const uc = { x: 12, y: 26, z: 89 };
yazdir(uc); // 12, 26
class SanalNokta {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
yazdir(new SanalNokta(13, 56)); // 13, 56uc değişkeni hiçbir yerde Nokta olarak tanımlanmadı ve fazladan z özelliği taşıyor; yine de kabul edildi, çünkü x ve y mevcut. SanalNokta sınıfı da Nokta arayüzünü açıkça uygulamadığı halde uyumlu. Gerekli özellikler eksikse ise hata alırsınız:
const renk = { hex: "#187ABF" };
yazdir(renk);
// TS2345: Argument of type '{ hex: string; }' is not assignable to parameter of type 'Nokta'.
// Type '{ hex: string; }' is missing the following properties from type 'Nokta': x, yJavaScript ile TypeScript karşılaştırması

| Konu | JavaScript | TypeScript |
|---|---|---|
| Tip denetimi | Çalışma zamanında, hata oluştuğunda | Derleme zamanında, kod çalışmadan önce |
| Sözdizimi | ECMAScript | ECMAScript ve tip sözdizimi |
| Çalıştırma | Doğrudan tarayıcı veya Node.js | Önce JavaScript'e dönüştürülür |
| Tipler çalışma zamanında | typeof ile kısıtlı bilgi | Silinir, çalışma zamanında yoktur |
| Tip uyumluluğu | Yok | Yapısal (şekle göre) |
| Editör desteği | Sınırlı çıkarım | Tamamlama, yeniden adlandırma, hızlı düzeltme |
| Dosya uzantısı | .js, .mjs, .cjs | .ts, .tsx, .mts, .cts |
TypeScript'in amacı geçerli JavaScript programlarının davranışını değiştirmek değil, sık yapılan hataları olabildiğince erken yakalamaktır. Resmî belgeler bunu açıkça vurgular: kodu JavaScript'ten TypeScript'e taşıdığınızda, derleyici tip hatası bildirse bile kod aynı şekilde çalışır.
Tip bilgisinin ikinci büyük faydası editörde ortaya çıkar. Derleyici bir değişkenin hangi özelliklere sahip olduğunu bildiği için, siz yazarken uygun özellikleri önerebilir, hatalı satırı anında işaretleyebilir, hızlı düzeltmeler sunabilir, bir adı projenin her yerinde güvenle yeniden adlandırabilir ve bir tanıma ya da tüm kullanım yerlerine atlamanızı sağlar. Handbook bu özelliklerin tamamının tip denetleyicisinin üzerine kurulduğunu ve platformlar arası çalıştığını belirtir.
Bir şey daha: JavaScript yazarken Visual Studio Code'da gördüğünüz otomatik tamamlamanın arkasında da TypeScript vardır. Yani TypeScript'i hiç kurmadan, dolaylı olarak kullanıyor olabilirsiniz. Mevcut bir JavaScript projesini kademeli olarak taşımak isterseniz JavaScript projesini TypeScript'e geçirme rehberine bakın.
Sık yapılan hatalar
- Tiplerin çalışma zamanında kontrol yapacağını sanmak: Derlenen kodda tip yoktur. Dış kaynaktan gelen veriyi elle doğrulayın.
- Hata varken kodun çalışmayacağını düşünmek: Varsayılan ayarda
tschata olsa da çıktı üretir. Hatalı kodun yayına çıkmaması için derleme adımınızda çıkış kodunu kontrol edin veyanoEmitOnErrorkullanın. - Nominal tipleme beklemek: Java veya C# deneyiminden gelenler, aynı şekle sahip iki farklı tipin birbirine atanabilmesine şaşırır. TypeScript'te bu beklenen davranıştır.
- JavaScript bilgisini atlamak: Çalışma zamanı davranışı tamamen JavaScript'tir; JavaScript veri tipleri ve eşitlik operatörleri gibi konular TypeScript'te de aynen geçerlidir.
Sık Sorulan Sorular
TypeScript ayrı bir programlama dili mi?
TypeScript, JavaScript'in tiplerle genişletilmiş bir üst kümesidir. Sözdizimi olarak her JavaScript kodu geçerli TypeScript'tir; TypeScript bunun üstüne tip sözdizimi ve tip kuralları ekler. Çalışma zamanı davranışı ise JavaScript'inkiyle aynıdır.
TypeScript kodu daha hızlı mı çalışır?
Hayır. Tipler derlemede silindiği için çalışan kod düz JavaScript'tir. TypeScript'in faydası hataları erken bulmak ve editör desteğidir, çalışma hızı değil.
Tarayıcı TypeScript dosyasını doğrudan çalıştırabilir mi?
Hayır. Tip ek açıklamaları ECMAScript'in parçası olmadığı için önce JavaScript'e dönüştürme gerekir. Node.js tarafında tipleri silerek çalıştırma desteği gelmiştir; bu konuyu TypeScript'i Node.js ile kullanma yazısında ele alıyoruz.
Küçük bir proje için TypeScript gerekli mi?
Zorunlu değil. Ancak birkaç dosyalık projelerde bile yazım hataları ve yanlış argüman türleri gibi sorunları erkenden yakalar. Kod büyüdükçe ve birden fazla kişi çalıştıkça faydası artar.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: TypeScript öğrenme rehberi · TypeScript kurulumu ve tsc · TypeScript temel tipler · JavaScript nedir · TypeScript ileri seviye