TypeScript’in en güçlü özelliklerinden biri, verilerinizi önceden tanımlayarak derleme aşamasında hataları yakalamasıdır. JavaScript’in dinamik doğasıyla başa çıkmak yerine, TypeScript size verilerinizin nasıl kullanılacağını açıkça belirtme imkanı sunar. Bu sayede, çalışma zamanında ortaya çıkabilecek tip hatalarını erkenden yakalayabilir, daha güvenilir ve bakımı kolay kodlar yazabilirsiniz.
Peki, TypeScript’in tür sistemi tam olarak nasıl çalışır? Temel kategorilerden — primitifler, nesneler ve özel türler — başlayarak, her birinin projenizdeki rolünü ve kullanım alanlarını inceleyelim. Bu rehber, hem TypeScript’e yeni başlayanlar hem de sistemin inceliklerini derinlemesine anlamak isteyen geliştiriciler için hazırlandı.
Tür Nedir ve Neden Önemlidir?
Türler, değişkenlerin, fonksiyonların ve nesnelerin alabileceği değerleri ve davranışları tanımlayan sözleşmelerdir. JavaScript’te bir değişkene sayı atayıp ardından metin atamak mümkünken, TypeScript bu esnekliği kısıtlayarak verilerinizin tutarlılığını garanti eder. Örneğin, bir fonksiyonun yalnızca sayı alan parametrelere sahip olduğunu belirtirseniz, derleme aşamasında hatalı kullanımları tespit edersiniz.
Bu yaklaşımın en büyük avantajı, hatalara önceden müdahale edebilmenizdir. Üretim ortamında karşılaşabileceğiniz tip hatalarını, kodunuzu çalıştırmadan önce yakalayarak proje stabilitesini artırırsınız. TypeScript’in tür sistemi ayrıca otomatik tamamlama ve dokümantasyon desteği sunar, böylece takım içindeki iletişim de kolaylaşır.
TypeScript’in Temel Türleri
TypeScript’te kullanılan türleri üç ana gruba ayırabiliriz: primitifler, nesneler ve özel türler. Her bir grubun kendine özgü kullanım senaryoları ve davranışları vardır.
Primitif Türler: Verilerinizin Temel Taşları
Primitif türler, TypeScript’in en basit ve en sık kullanılan veri türleridir. JavaScript’ten miras alınan bu türler, doğrudan dilin çekirdeğinde yer alır ve performans açısından optimize edilmiştir.
- boolean: Sadece
trueveyafalsedeğerlerini alabilir. Mantıksal ifadelerinizin temelini oluşturur.
// Açık olarak tip tanımlama
let isActive: boolean = true;
// Tür çıkarımı (inference) örneği
let isVisible = false; // TypeScript otomatik olarak boolean olduğunu anlar- number: Tüm sayısal değerleri temsil eder — tam sayılar, ondalık sayılar, hexadecimal, binary ve özel durumlar (
NaN,Infinity). Büyük tam sayılar içinbigintkullanılır.
// Farklı sayı formatları
let hex: number = 0xFF; // Hexadecimal
let octal: number = 0o52; // Octal
let binary: number = 0b1010; // Binary
// Büyük sayılar için bigint
const hugeNumber: bigint = 9007199254740993n;- string: Metinsel verileri temsil eder. Template literallarla statik olarak tip bile oluşturabilirsiniz.
// Template literal türü
// Örneğin, API endpoint'lerinde kullanılan dinamik rotaları tip olarak tanımlayabilirsiniz:
type ApiRoute = `/api/${'users' | 'posts' | 'auth'}`;
// Bu, yalnızca `/api/users`, `/api/posts` veya `/api/auth` değerlerini kabul eder- void: Fonksiyonların hiçbir değer döndürmediğini belirtir. Geri dönüş değeri olarak kullanılır.
// void fonksiyon örneği
function logMessage(message: string): void {
console.log(message);
// return; // veya return undefined; — her ikisi de geçerli
}- null ve undefined: Değerin yokluğunu temsil eder. TypeScript’in
strictNullChecksseçeneğiyle bu türler diğer türlerle doğrudan eşleşmez.
// undefined örneği
let userId: number | undefined;
// null örneği
let config: string | null = null;
// Nullish coalescing operatörü
const displayName = config ?? "Varsayılan Kullanıcı";Nesne Türleri: Veri Yapılarını Tanımlama
Nesne türleri, karmaşık veri yapılarınızı tanımlamanıza olanak tanır. interface ve type olmak üzere iki ana yöntem bulunur.
#### Interface: Esnek ve Genişletilebilir Türler
Interface’ler, özellikle API’ler ve dış kaynaklarla entegrasyon gibi durumlarda tercih edilir. Yapısal tip sistemine sahiptir — yani bir nesnenin belirli bir arayüzü karşıladığını belirtirsiniz.
// Temel interface tanımı
interface User {
readonly id: number; // Değiştirilemez (sadece okunabilir)
name: string;
email?: string; // İsteğe bağlı alan
}
// Extend ile genişletme
interface Admin extends User {
permissions: string[];
}
// Declaration merging — aynı ismi taşıyan interface'ler birleştirilir
interface User {
isActive: boolean;
}#### Type Alias: Esnek Tür Tanımları
Type alias’lar, daha esnek tür tanımları oluşturmanızı sağlar. Union, intersection ve diğer karmaşık türleri kolayca oluşturabilirsiniz.
// Union türü
type Status = "active" | "inactive" | "pending";
// Intersection türü
type AdminUser = User & { role: "admin" };
// Tuple türü
type Coordinates = [number, number];Özel Türler ve Gelişmiş Kavramlar
TypeScript’in tür sistemi, yalnızca basit tanımlamaların ötesine geçer. Aşağıdaki özelliklerle daha ifade edici ve güvenilir kodlar yazabilirsiniz.
- Union Türleri: Bir değişkenin birden fazla türden değer alabileceğini belirtir.
// Bir değişkenin ya sayı ya da metin olabileceğini tanımlama
type Id = number | string;- Intersection Türleri: Birden fazla türün özelliklerini birleştirir.
interface Person {
name: string;
}
interface Employee {
company: string;
}
// Her iki interface'in özelliklerini taşıyan bir tür
const worker: Person & Employee = {
name: "Ayşe",
company: "TechCorp"
};- Generic Türler: Tür parametreleriyle yeniden kullanılabilir türler oluşturun.
// Fonksiyonlarda generic kullanımı
function identity<T>(arg: T): T {
return arg;
}
// Array tipinde generic kullanımı
type StringArray = Array<string>;Türleri Uygulamada Kullanma
TypeScript’in tür sistemini projelerinizde nasıl etkili bir şekilde kullanabileceğinize dair bazı ipuçları:
- Tip Güvenliğini Artırma: Fonksiyon parametrelerini ve dönüş değerlerini açıkça tanımlayın. Böylece derleme aşamasında hataları yakalayabilirsiniz.
// Güvensiz fonksiyon örneği
function add(a, b) {
return a + b;
}
// Güvenli versiyon
function safeAdd(a: number, b: number): number {
return a + b;
}- Dokümantasyon ve İletişim: Tür tanımları, kodunuzun nasıl kullanılacağını gösteren otomatik dokümantasyon görevi görür. Takım içindeki yeni geliştiricilerin projeyi anlamasını kolaylaştırır.
- Refactoring ve Bakım: Tür sistemi, kodunuzu yeniden yapılandırırken veya yeni özellikler eklerken size yol gösterir. Değişikliklerinizin tüm projeye nasıl yayılacağını önceden görmenizi sağlar.
TypeScript’in tür sistemi, modern web geliştirme sürecinin vazgeçilmez bir parçası haline geldi. Primitiflerden karmaşık nesne türlerine kadar geniş bir yelpazede size esneklik ve güvenlik sunar. Bu rehberde ele aldığımız temel kavramları projelerinize uygulayarak, daha sağlam ve bakımı kolay kodlar yazabilirsiniz.
Geliştirme sürecinizde TypeScript’in sunduğu avantajları tam olarak kullanabilmek için, tür tanımlarınızı olabildiğince detaylı ve açık bir şekilde yapmaya özen gösterin. Bu sayede, hem hata oranlarınızı azaltabilir hem de takım içindeki iş birliğini güçlendirebilirsiniz.
Yapay zeka özeti
TypeScript’in temel tür sistemini keşfedin. Primitiflerden nesnelere, union ve intersection türlerine kadar her şeyi öğrenin. Kod güvenliğinizi artırın.