TypeScript’in tip sistemi, değişkenleri tek bir kalıba hapsetmek yerine gerçek dünyadaki çeşitliliği modellememize yardımcı olur. Bir değerin alternatif tiplerden birini taşıyabildiği durumlarda union, farklı yapıların bütün özelliklerini aynı nesnede toplamak istediğimizde ise intersection tipleri devreye girer. İsimleri matematik dersini hatırlatsa da doğru kullanıldıklarında kodu hem güvenli hem de oldukça esnek hâle getirirler.
Devamı...
TypeScript derleyicisi çoğu zaman değişkenlerin tipini başarıyla çıkarır; ancak DOM işlemleri, API yanıtları veya genel amaçlı kütüphaneler söz konusu olduğunda elindeki bilgi yetersiz kalabilir. Tip zorlama, yani type assertion, geliştiricinin “Bu verinin tipini senden daha iyi biliyorum” diyerek sorumluluğu devralmasıdır. Bu işlem genellikle as anahtar kelimesiyle yapılır; fakat adına rağmen veriyi çalışma zamanında gerçekten dönüştürmez.
Devamı...
Bir fonksiyonun her çağrıda aynı miktarda bilgiye ihtiyaç duymaması oldukça doğaldır. Kullanıcı adını zorunlu tutarken selamlama biçimini çağırana bırakmak isteyebiliriz. TypeScript’in isteğe bağlı ve varsayılan parametreleri, bu esnekliği tip güvenliğinden vazgeçmeden sağlar. Böylece fonksiyonlarımız hem rahat kullanılır hem de “Bu değer acaba var mı?” sürprizleri kontrol altında tutulur.
Devamı...
TypeScript dünyasında interface ve type, nesnelerin biçimini tanımlarken sık sık aynı işi yapıyormuş gibi görünür. İkisi de özelliklerin türünü belirler, yeniden kullanılabilir modeller oluşturur ve editörün otomatik tamamlama yeteneklerini güçlendirir. Ancak konu genişletme, bildirim birleştirme ve karmaşık tür hesaplamalarına geldiğinde bu iki araç farklı karakterlere bürünür.
Devamı...
TypeScript kullanırken bazen elimizdeki değerin tipini gerçekten bilemeyiz. Bir API cevabı, kullanıcı girdisi veya eski bir JavaScript kütüphanesi her şeyi döndürebilir. İşte bu belirsizlik karşısında any ve unknown sahneye çıkar. İkisi de “Bu değerin tipi şimdilik belli değil” diyebilir; ancak biri güvenlik kapısını açık bırakırken diğeri kimlik kontrolü yapmadan kimseyi içeri almaz.
Devamı...
Bir kullanıcı modeliniz olduğunu ve kayıt, güncelleme, listeleme gibi her işlem için neredeyse aynı arayüzü tekrar tekrar yazdığınızı düşünün. TypeScript’in yerleşik yardımcı tipleri tam bu noktada devreye girer. Partial, Pick ve Omit, mevcut bir veri modelini kopyalamadan dönüştürmemizi sağlar; böylece hem kod tekrarı azalır hem de modeller arasındaki ilişki derleyici tarafından korunur.
Devamı...
Bir projede aynı uzun tip tanımını üçüncü kez yazarken parmaklarınız “Bunun daha kısa bir yolu olmalı!” diye isyan ediyorsa, TypeScript’in tip takma adları yardımınıza yetişir. Type alias, karmaşık veya sık kullanılan bir tipe anlamlı bir isim vererek kodun okunabilirliğini artırır; üstelik bunu çalışma zamanına ek yük getirmeden yapar.
Devamı...
JavaScript projelerine tür güvenliği, daha güçlü editör desteği ve erken hata yakalama yeteneği kazandırmak istiyorsanız TypeScript harika bir başlangıç noktasıdır. Bu rehberde TypeScript derleyicisini Node.js üzerinden kuracak, temel yapılandırmayı gerçekleştirecek ve hazırladığımız çalışma ortamını VS Code içinde küçük bir örnekle sınayacağız.
Devamı...
JavaScript, geliştiriciye büyük bir hareket özgürlüğü sunar; ancak bu özgürlük bazen üretim ortamında patlayan küçük sürpriz paketlerine dönüşebilir. TypeScript’in temel felsefesi, JavaScript’in esnekliğini ortadan kaldırmak değil, program çalışmadan önce olası hataları görünür hâle getiren bir düşünme katmanı eklemektir. C ve C++ dünyasındaki statik tip denetimini anımsatan bu yaklaşım, dinamik web ekosistemine daha güvenli ve ölçeklenebilir bir geliştirme modeli kazandırır.
Devamı...
Bir fonksiyona “herhangi bir metin” vermek ile yalnızca "başlat" veya "durdur" değerlerinden birini vermek arasında büyük bir güvenlik farkı vardır. TypeScript’in birebir tipleri (literal types), değişkenlerin alabileceği değerleri kesin biçimde sınırlandırır. Böylece hem hatalar daha kod çalıştırılmadan yakalanır hem de editör önerileri çok daha anlamlı hâle gelir.
Devamı...
Bir değişken tanımlarken veri türünü yazmadığınız hâlde editörünüzün onun sayı mı, metin mi yoksa daha karmaşık bir nesne mi olduğunu bilmesi sihir gibi görünebilir. Aslında perde arkasında çalışan mekanizma tip çıkarımıdır. Derleyici, atanan ifadeyi inceleyerek uygun türü belirler; böylece kod kısalırken statik tip güvenliği büyük ölçüde korunur.
Devamı...
Bir programın dünyayı nasıl algıladığını hiç düşündünüz mü? Bizim için yaş, isim ve ışığın açık olup olmadığı farklı kavramlardır. Bilgisayar açısından da bunlar sırasıyla sayı, metin ve mantıksal değer olarak temsil edilir. Temel veri tipleri, verinin anlamını belirleyerek yanlış değerlerin daha kod çalışmadan yakalanmasını sağlar. Kısacası tipler, değişkenlerin kapısında bekleyen seçici güvenlik görevlileridir.
Devamı...
Bir sınıfı yalnızca değişkenleri ve metotları bir araya getiren bir kutu olarak düşünmek eksik kalır. İyi tasarlanmış bir sınıf, kendi verisini koruyan ve dış dünyaya kontrollü bir kullanım alanı sunan küçük bir kale gibidir. public, private ve protected erişim belirleyicileri ise bu kalenin hangi kapılarının herkese, hangilerinin yalnızca içeridekilere açılacağını belirler.
Devamı...
Bir özellik geliştirdiniz, testleri çalıştırdınız ve kodunuz bilgisayarınızda kusursuz görünüyor. Peki bu kod doğrudan ana projeye eklenmeli mi? Genellikle hayır! Pull Request ve Code Review süreçleri, kodun ana dala ulaşmadan önce teknik doğruluk, okunabilirlik, güvenlik ve ekip standartları açısından denetlendiği bir kalite kapısı oluşturur.
Devamı...
Bir fonksiyonu int için yazıp ardından string, double ve kendi sınıflarımız için kopyalamak, yazılım dünyasının pek de eğlenceli olmayan tekrarlarından biridir. Jenerikler (generics), algoritmayı veri tipinden ayırarak aynı kodun farklı türlerle güvenli biçimde çalışmasını sağlar. C++ şablonlarını andıran bu yaklaşım, özellikle C#, Java ve TypeScript gibi dillerde yeniden kullanılabilir yapıların temelini oluşturur.
Devamı...
Bir Git deposunun geçmişi, projenin nasıl geliştiğini anlatan dijital bir seyir defteridir. Her commit; yapılan değişiklikleri, değişikliği yapan kişiyi ve önceki duruma giden bağlantıyı saklar. Yanlış bir commit oluşturduğumuzda paniğe kapılmak yerine bu kayıtları okuyabilir, ardından reset veya revert ile güvenli bir zaman yolculuğuna çıkabiliriz.
Devamı...
Bir fonksiyonun yalnızca ne yaptığını değil, hangi verileri kabul edip hangi türde sonuç ürettiğini bilmek, yazılım geliştirmeyi tahmin oyunundan çıkarır. Parametre ve dönüş tipi belirtimleri; modüller arasındaki sözleşmeyi görünür kılar, hataları erkenden yakalar ve kod tamamlama araçlarını daha kullanışlı hâle getirir. Kısacası tipler, fonksiyonların kapısındaki “Giriş şartları ve çıkış garantisi” tabelasıdır.
Devamı...
Bir siparişin durumunu 1, kullanıcı rolünü "A", haftanın gününü ise 4 ile temsil ettiğinizi düşünün. Bu değerler çalışır; fakat kodu aylar sonra okuyan geliştirici için küçük bir bilmeceye dönüşür: “1 hazırlanıyor mu, kargoda mı?” Enum, ilişkili sabitleri anlamlı isimlerden oluşan tek bir tür altında toplayarak bu bilmeceleri ortadan kaldırır.
Devamı...
Bir alışveriş sepetinde aynı türden ürünleri yan yana dizmek kolaydır; fakat ürünün adı, fiyatı ve stok durumu gibi farklı bilgileri tek paket hâlinde taşımak başka bir düzen gerektirir. Programlamada dinamik diziler aynı türdeki elemanları büyüyebilen bir koleksiyonda saklarken demetler, farklı türdeki belirli sayıda değeri sıralı bir bütün olarak tutar. Aralarındaki asıl fark yalnızca sözdiziminde değil, belleğin nasıl ayrıldığı ve veriye nasıl erişildiğindedir.
Devamı...
Bir orkestrada her müzisyen farklı bir enstrüman çalabilir; ancak şefin verdiği işaretlerin ne anlama geldiğini hepsi bilir. Nesne yönelimli programlamadaki arayüzler (interfaces) de benzer biçimde çalışır. Bir sınıfın iç dünyasını yönetmez, fakat dışarıya hangi özellikleri ve davranışları sunması gerektiğini açıkça bildirir. Böylece birbirinden farklı nesneler, ortak bir sözleşmeye uyarak aynı sistem içinde güvenle çalışabilir.
Devamı...