TypeScript
Ortak konu · İlan 1 İlan 2 İlan 3

TypeScript nedir, neden var?

JavaScript'in üzerine derleme zamanında tip kontrolü ekleyen bir katman. Tarayıcı TypeScript'i anlamaz — tsc (veya Next.js'in kullandığı SWC) onu düz JavaScript'e "derler" (transpile eder). Kazandırdığı şey: hatayı kullanıcı görmeden, editörde, yazarken yakalamak.

💡
Mülakatta 1 cümlelik tanımDeğişkenler, fonksiyon parametreleri ve dönüş değerleri için tip ekleyerek, runtime'da patlayacak hataları (örn. undefined.map) derleme anında yakalamamızı sağlayan JavaScript üst kümesi.

1. Temel tipler

let ad: string = "Ahmet";
let yas: number = 29;
let aktif: boolean = true;
let etiketler: string[] = ["senior", "frontend"];
let koordinat: [number, number] = [41.01, 28.97]; // tuple — sabit uzunluk ve sıradaki tip

// any KULLANMA — TS'i kapatmak gibidir. Bilmiyorsan unknown kullan:
function handleApi(veri: unknown) {
  if (typeof veri === "string") { // daraltma (narrowing) olmadan veriyi kullanamazsın
    console.log(veri.toUpperCase());
  }
}

2. interface vs type

%90 durumda ikisi de aynı işi görür. Kural: obje şekli tanımlıyorsan ve genişletilebilir olmasını istiyorsan interface; union, tuple ya da hesaplanmış bir tip gerekiyorsa type.

interface Kullanici {
  id: number;
  ad: string;
  rol?: "admin" | "editor"; // ?  → opsiyonel alan
}
interface AdminKullanici extends Kullanici { yetkiler: string[] }

// type: union'lar için interface çalışmaz, type gerekir
type Durum = "loading" | "success" | "error";
type ApiSonuc<T> = { durum: "success"; veri: T } | { durum: "error"; mesaj: string };

3. Generics — "tip parametresi"

Fonksiyonun hangi tiple çağrıldığını hatırlayan bir kalıp. En somut örnek: useState<T>().

function ilkEleman<T>(liste: T[]): T | undefined {
  return liste[0];
}
ilkEleman([1,2,3]);          // T = number olarak çıkarılır
ilkEleman(["a","b"]);        // T = string

// React'te en çok burada görürsün:
const [kullanici, setKullanici] = useState<Kullanici | null>(null);

4. Utility types (mülakatta sorulan klasikler)

UtilityNe yaparÖrnek
Partial<T>Tüm alanları opsiyonel yaparPartial<Kullanici> → PATCH endpoint body'si
Pick<T,K>Sadece seçili alanları alırPick<Kullanici,"id"|"ad">
Omit<T,K>Seçili alanları çıkarırOmit<Kullanici,"id"> → create DTO
Record<K,V>Anahtar/değer map'i tanımlarRecord<string, Kullanici>
Readonly<T>Alanları değiştirilemez yaparRedux state tipleri için sık kullanılır

5. React + TypeScript — gerçekte yazacağın kod budur

type ButonProps = {
  etiket: string;
  varyant?: "primary" | "ghost";
  onClick: () => void;
  children?: React.ReactNode;
};

const Buton: React.FC<ButonProps> = ({ etiket, varyant = "primary", onClick, children }) => (
  <button className={`btn btn-${varyant}`} onClick={onClick}>{etiket}{children}</button>
);

// Event tipleme — bunu ezberle, hep aynı kalıp:
function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
  console.log(e.target.value);
}
function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
  e.preventDefault();
}
⚠️
Next.js'te sık sorulan tuzakRoute handler / server action dönüş tiplerini generic'lerle tiplemek beklenir. "Neden any kullanmadın?" sorusuna "tip güvenliği build-time'da kırılır, prod'a hatalı veri şekli gitmez" diye cevap ver.

Egzersizler

1) Aşağıdaki fonksiyonu tiple: bir kullanıcı listesi alıp sadece aktif olanların isimlerini döndürsün.
interface Kullanici { ad: string; aktif: boolean }
function aktifIsimler(liste: Kullanici[]): string[] {
  return liste.filter(k => k.aktif).map(k => k.ad);
}
2) interface ile bir union type (ör. "loading"|"success"|"error") neden tanımlanamaz?
Çünkü interface sadece obje şekli (nesne sözleşmesi) tanımlar; birden fazla olası tipi "veya" ile birleştirmek type'ın işidir. Bunun yerine type Durum = "loading" | "success" | "error" yazılır.
3) Bir API cevabı ya {status:'ok', data: T} ya da {status:'error', message: string} olabiliyor. Bunu nasıl modellersin ve neden bu yapı güvenlidir?
Discriminated union ile: type Res<T> = {status:"ok"; data:T} | {status:"error"; message:string}. Güvenlidir çünkü if (res.status==="ok") dedikten sonra TypeScript otomatik olarak res.data'ya erişimi açar, error dalında ise data alanına erişmeye çalışırsan derleme hatası verir — "unutulan null kontrolü" bug'ını daha yazarken engeller.