İçeriğe geç
Muhammet Şafak
en
Diller 2 dk okuma

TypeScript'e geçiş: JavaScript'te tip güvenliği

Büyüyen bir frontend kod tabanını TypeScript ile korumaya başlamanın pratik deneyimi: ne kazandım, ne kaybettim ve ne zaman gerçekten değer verdi?

Kapak görseli — solda app.js (legacy) etiketli dağınık kod çıktıları, sağda Interface, Type, extends ve interface User yazan mor ışıklı küp ızgarası

Bu yazı 7 yıl önce yazıldı — o günün koşullarını yansıtır.


Frontend kod tabanlarım büyüdükçe bir örüntü fark ettim: bir fonksiyonun parametresine yanlış tip geçmek, yanlış bir property okumak gibi hatalar runtime’da ortaya çıkıyor; üstelik bazen çok geç. PHP’de 7.x ile birlikte daha sıkı tip bildirimleri kullandığımda bunun büyük bir güven verdiğini yaşamıştım. JavaScript tarafında da aynı güvenceyi istiyordum. Bu yüzden TypeScript’e geçiş kararını verdiğimde hazırlıklı hissediyordum — ama gerçek deneyim beklediğimden farklıydı.

TypeScript nedir?

TypeScript, JavaScript’e statik tip sistemi ekleyen ve Microsoft tarafından geliştirilen bir superset dilidir. Yazdığınız TypeScript kodu derlenerek sıradan JavaScript’e çevriliyor; tarayıcı ya da Node.js için ayrı bir şey gerekmez. TypeScript yalnızca yazma anında size söyler: “bu değer string bekliyor, number veriyorsunuz.”

Geçişe nereden başladım?

Mevcut bir projeye TypeScript eklemek için en az acılı yol, tsconfig.json’da "strict": false ile başlayıp kademeli olarak arttırmak. Tüm dosyaları .js’ten .ts’e değiştirmek zorunda değilsiniz; allowJs: true ile iki formatı karıştırabilirsiniz.

Yeni bir component yazmaya karar verdiğimde doğrudan TypeScript ile başladım:

interface User {
  id: number;
  name: string;
  email: string;
  role: 'admin' | 'editor' | 'viewer';
}

function formatUserLabel(user: User): string {
  return `${user.name} <${user.email}>`;
}

// Bu satır derleme anında hata verir:
// formatUserLabel({ id: 1, name: 'Test' }); // email eksik

PHP’de tip bildirimleri method imzasında; TypeScript’te ise interface veya type alias ile veri şekillerini tanımlıyorsunuz. Başta tuhaf geldi ama hızla alıştım.

En değerli olduğu anlar

Refactor güvencesi. Bir interface’in alanını yeniden adlandırdığınızda, onu kullanan her yerde TypeScript hata veriyor. JavaScript’te bu hatayı testler yakalamasa runtime’da keşfederdiniz.

IDE entegrasyonu. TypeScript ile birlikte autocomplete çok daha güçleniyor. user. yazdığınızda hangi alanların var olduğunu biliyor. Parametre tiplerini yanlış girdiğinizde anında kırmızı çizgi görüyorsunuz.

Takım içi iletişim. Interface’ler, bir fonksiyonun ne beklediğini ve ne döndürdüğünü açıkça söyleyen canlı dokümantasyon gibi davranıyor.

Sürtünme noktaları

TypeScript’in öğrenme eğrisi, syntax’tan çok tip sisteminin kendisinden geliyor. Basit durumlar kolayca ifade ediliyor. Ama gerçek dünyada:

// Dış API'den gelen yanıt tipi belirsizse:
const response = await fetch('/api/users');
const data = await response.json(); // 'any' tip — güvence yok

Dış veriyi tip sistemine sokmak için type guard ya da as type assertion kullanmak gerekiyor. Bu alan hâlâ benim için öğrenme sürecinde.

function isUser(obj: unknown): obj is User {
  return typeof obj === 'object' && obj !== null && 'id' in obj;
}

Ayrıca her üçüncü parti kütüphane TypeScript tiplerine sahip değil. @types/... paketleri çoğu popüler kütüphaneyi kapsıyor ama bazen any ile çalışmak zorunda kalıyorsunuz.

strict modu: erken mi geç mi açmalı?

"strict": false ile başlamak geçişi kolaylaştırıyor, ama bir tuzak var: strict kapalıyken TypeScript sizi gerçek hatalardan da korumayabiliyor. strictNullChecks olmadan nullable hataları yakalanmıyor; noImplicitAny olmadan any tip sessizce yayılıyor. Yeni dosyalarda hemen strict: true ile başlamak, sonradan kapsamı genişletmekten çok daha az acı verdi. Eski dosyaları kademe kademe sıkılaştırmak ise ayrı bir iş — ama yapılabilir.

JavaScript’i bırakmak mı?

TypeScript, JavaScript’in bir alternatifi değil; üstüne oturan bir araç. Tüm JavaScript kodunuz geçerli TypeScript. Fark şu: TypeScript sizi yavaşlatmıyor, aksine büyük kod tabanlarında hız kazanmanızı sağlıyor. Küçük bir script için tip bildirimleri fazlalık olabilir; ama birkaç geliştirici, yüzlerce dosya içeren bir proje düşünüldüğünde trade-off açıkça TypeScript lehine.

PHP backend’imde tip güvenliğinin verdiği konforu frontend’de de yaşıyorum artık. Geçişin başlangıç maliyeti var ama uzun vadede değerli.

Bu konudaki deneyler

480 altıgende 60 turda biten, tarayıcıda çevrimdışı çalışan zarsız strateji oyunu çekirdeği; Regnarium olarak yayına çıktı.

Şu an ne yapıyor

480 altıgenlik haritada azami 60 turda biten bir 4X eli yürütüyor; kurallar, harita üretimi ve rakip yapay zekâ tek bir saf TypeScript çekirdeğinde, savaş zarsız. Elinde yarım saati olan ve strateji oynamak isteyen herkes tarayıcıdan açabilir.

Web uygulaması TypeScript Next.js React +2 daha
Eylül 2026 — Eylül 2026

Kaydırmalı doğru/yanlış bilgi yarışması; asıl mesele oyun değil, istemcinin ürettiği skoru imzayla doğrulanabilir kılmak.

Şu an ne yapıyor

Kaydırmalı doğru/yanlış bilgi yarışması bir mobil uygulama olarak çekirdek döngüsüyle uçtan uca çalışıyor; skoru istemci üretse de server_nonce ve HMAC imzasıyla sunucu tarafında doğrulanıyor. swipenor.com uygulamanın tanıtım sayfasıdır, oyunun kendisi değil.

Mobil uygulama Laravel PHP PostgreSQL +6 daha
Temmuz 2026 — Devam ediyor
Etiketler: #TypeScript
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi