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)
| Utility | Ne yapar | Örnek |
|---|---|---|
Partial<T> | Tüm alanları opsiyonel yapar | Partial<Kullanici> → PATCH endpoint body'si |
Pick<T,K> | Sadece seçili alanları alır | Pick<Kullanici,"id"|"ad"> |
Omit<T,K> | Seçili alanları çıkarır | Omit<Kullanici,"id"> → create DTO |
Record<K,V> | Anahtar/değer map'i tanımlar | Record<string, Kullanici> |
Readonly<T> | Alanları değiştirilemez yapar | Redux 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.