02 / 09
Temel tipler ve çıkarım
Primitive tipler, array, fonksiyon tipleri, any ve unknown ile type inference.
Tip Belirtmek
TypeScript'te bir değişkenin, parametrenin ya da dönüş değerinin tipi, adından sonra iki nokta üst üste ile yazılır. Buna type annotation denir.1
let productName: string = "Kablosuz Kulaklık";
let price: number = 1299.9;
let inStock: boolean = true;
price = "1299";
// Hata: Type 'string' is not assignable to type 'number'.Üç temel (primitive) tip string, number ve boolean'dır. number tam sayı ve ondalık sayıyı ayırmaz; JavaScript'te ikisi de aynı tiptir. Tipleri her zaman küçük harfle yazın: String, Number ve Boolean başka şeylerdir.1 Daha seyrek kullanılan bigint ve symbol de vardır.
Tip Çıkarımı
Yukarıdaki örnekte tipleri yazmaya gerek yoktu. TypeScript, değişkenin tipini ilk değerinden kendisi çıkarır. Buna tip çıkarımı (type inference) denir.12 let price = 1299.9; yazdığınızda price yine number olur ve price = "1299" aynı hatayı verir. Editörde değişkenin üzerine geldiğinizde çıkarılan tipi görürsünüz. Resmi Handbook'un önerisi açıktır: "Yeni başlıyorsanız düşündüğünüzden daha az type annotation yazmayı deneyin."1
| Nerede | Tip yazılır mı? |
|---|---|
| Yerel değişkenler | Hayır, çıkarıma bırakın |
| Fonksiyon parametreleri | Evet, TypeScript parametreyi kullanımdan çıkarmaz |
Callback parametreleri (map, onClick) | Hayır, bağlamdan çıkarılır |
| Dışa açılan fonksiyonun dönüş tipi | Yazmayı düşünün |
Dan Vanderkam da Effective TypeScript'te aynı kuralı verir: yerel değişkenlere değil, fonksiyon imzalarına tip yazın.3 Dönüş tipini yazmak, fonksiyonun içindeki bir hatanın onu kullanan her yere yayılmasını engeller; hata fonksiyonun kendisinde görünür.3 Matt Pocock da modülün en üst seviyesindeki fonksiyonlara dönüş tipi yazmayı, JSX döndüren component'leri ise bunun dışında tutmayı önerir.4
export function getShippingCost(total: number): number {
if (total >= 500) {
return 0;
}
return "49.90";
// Hata: Type 'string' is not assignable to type 'number'.
}let ve const farkı
let ile tanımlanan değişken sonradan değişebileceği için genel tipi alır. const değişmeyeceği için tam değerin kendisi tip olur. Buna literal tip denir.1
let orderStatus = "pending"; // string, sonra "shipped" atanabilir
const currency = "TRY"; // "TRY"Array ve Tuple
Array tipi, eleman tipinin sonuna [] eklenerek yazılır. Array<number> yazımı da aynı anlama gelir; bu <> yazımını Generic'ler dersinde göreceksiniz.1
Farklı tipte elemanlar varsa TypeScript hepsini kapsayan bir tip seçer.2 Tuple ise eleman sayısı ve her sıradaki tipi sabit olan bir array'dir.5 React'te useState'in döndürdüğü [value, setValue] çifti de bir tuple'dır.
const prices: number[] = [1299.9, 249];
const tags: Array<string> = ["ses", "kablosuz"];
const ids = [1, 2, 3]; // number[]
ids.push("4");
// Hata: Argument of type 'string' is not assignable to parameter of type 'number'.
const mixed = [1, "iki", null]; // (string | number | null)[]
const entry: [string, number] = ["Kablosuz Kulaklık", 2]; // tupleFonksiyonlar
Parametre tipleri parametre adından sonra, dönüş tipi parantezden sonra yazılır. Tip yazılan parametreye gelen her argüman kontrol edilir.1
function calculateTotal(price: number, quantity: number): number {
return price * quantity;
}
calculateTotal(1299.9);
// Hata: Expected 2 arguments, but got 1.Opsiyonel ve varsayılan parametreler
Parametre adından sonra ? koymak onu opsiyonel yapar; içeride tipi string | undefined olur. Varsayılan değer verilen parametre de opsiyoneldir ve tipini o değerden alır.6
function formatPrice(amount: number, currency?: string) {
return `${amount.toFixed(2)} ${currency ?? "TRY"}`;
}
function applyDiscount(price: number, rate = 0.1) {
return price * (1 - rate); // rate: number
}
formatPrice(249); // "249.00 TRY"
applyDiscount(1000, "0.2");
// Hata: Argument of type 'string' is not assignable to parameter of type 'number'.void ve arrow function
Değer döndürmeyen fonksiyonun dönüş tipi void'dir.6 Arrow function'larda tipler aynı yerlere yazılır. Fonksiyon map gibi tipini bilen bir yere verildiğinde parametre tipi bağlamdan çıkarılır; buna contextual typing denir.12
function logOrder(orderId: string): void {
console.log(`Sipariş alındı: ${orderId}`);
}
const toUpper = (text: string) => text.toUpperCase(); // dönüş: string
const labels = [249, 89.5].map((p) => p.toFixed(2)); // p: numberFonksiyon tipi
Bir fonksiyonu parametre olarak alırken ya da prop olarak verirken tipini (parametre: tip) => dönüşTipi şeklinde yazarsınız. Parametre adı zorunludur.6
type PriceFormatter = (amount: number) => string;
function renderPrice(amount: number, format: PriceFormatter) {
return format(amount);
}
renderPrice(249, (amount) => `${amount} TL`);
renderPrice(249, (amount) => amount * 2);
// Hata: Type 'number' is not assignable to type 'string'.type ile tipe isim verme konusunu Interface, type ve union dersinde ayrıntılı göreceksiniz.
null ve undefined
strictNullChecks açıkken null ve undefined kendi tipleridir; string bekleyen yere null veremezsiniz.7 Bu ayar strict ile birlikte gelir ve TypeScript 7'de strict artık varsayılan olarak açıktır.8 Bir değer olmayabilirse bunu tipte | ile söylersiniz:
function formatCoupon(code: string | null) {
code.toUpperCase();
// Hata: 'code' is possibly 'null'.
if (code !== null) {
return code.toUpperCase(); // burada code: string
}
return "Kupon yok";
}| ile yazılan union tiplere sonraki derste, if ile tipi daraltmaya (narrowing) Narrowing ve type guard dersinde değineceğiz.
any, unknown ve never
any tip kontrolünü kapatır: her şeyi kabul eder, her işleme izin verir. Bu yüzden kaçınılması gerekir.1 function getTotal(items) {...} gibi tipsiz bir parametreyi TypeScript any sayar; noImplicitAny ayarı (strict ile açık) bunu Parameter 'items' implicitly has an 'any' type. hatasına çevirir.9
unknown, any'nin güvenli karşılığıdır: her değer atanabilir ama tipi kontrol edilmeden üzerinde hiçbir işlem yapılamaz.10 Bu yüzden JSON.parse ya da API'den gelen veri gibi tipi bilinmeyen değerler için doğru seçimdir.11
const fromAny: any = JSON.parse('{"price": 249}');
fromAny.prise.toFixed(2); // derlenir, çalışırken patlar
const fromUnknown: unknown = JSON.parse('{"price": 249}');
fromUnknown.price;
// Hata: 'fromUnknown' is of type 'unknown'.unknown bir değeri kullanmadan önce typeof gibi kontrollerle tipini doğrularsınız; bunu Narrowing ve type guard dersinde göreceksiniz.
Tip
any "bunun ne olduğu umurumda değil", unknown ise "bunun ne olduğunu bilmiyorum" demektir.11 Emin olmadığınızda unknown yazın; TypeScript sizi önce kontrol etmeye zorlar.
never hiçbir zaman oluşmayan değerin tipidir; örneğin her zaman hata fırlatan function fail(message: string): never fonksiyonunun dönüş tipi.6
Literal Tipler ve as const
Literal tipleri | ile birleştirerek bir değişkenin alabileceği değerleri sınırlayabilirsiniz: let size: "S" | "M" | "L" değişkenine "XL" atanamaz.1 Bunu bir sonraki derste ayrıntılı göreceksiniz.
Object içindeki özellikler değişebileceği için genel tipi alır. Sonuna as const eklemek tüm değerleri literal ve readonly yapar.1
const config = { currency: "TRY", taxRate: 0.2 };
// { currency: string; taxRate: number }
const constConfig = { currency: "TRY", taxRate: 0.2 } as const;
// { readonly currency: "TRY"; readonly taxRate: 0.2 }
constConfig.taxRate = 0.1;
// Hata: Cannot assign to 'taxRate' because it is a read-only property.Object Tipine İlk Bakış
Object'in tipini, özelliklerini süslü parantez içinde sayarak doğrudan yazabilirsiniz. Eksik bir özellik hata verir.1
function printProduct(product: { name: string; price: number }) {
console.log(`${product.name}: ${product.price} TL`);
}
printProduct({ name: "Kablosuz Kulaklık" });
// Hata: Property 'price' is missing in type '{ name: string; }' but required in type '{ name: string; price: number; }'.Bu yazım tek seferlik kullanımlar içindir. Aynı şekli birden çok yerde kullanmak için ona type ya da interface ile isim verirsiniz; bunu bir sonraki derste anlatıyoruz.
Kendin Dene
TypeScript Playground'u açın ve:
const total = calculateTotal(249, 2)yazıptotal'ın üzerine gelin; çıkarılan tipi görün.calculateTotal'ın parametrelerinden tipleri silin ve çıkanimplicitly has an 'any' typehatasını okuyun.getShippingCost'tan: numberdönüş tipini silin; hatanın kaybolduğunu ve dönüş tipinin"49.90" | 0olarak çıkarıldığını görün.JSON.parsesonucunuunknowntipinde bir değişkene atayın vetypeofkontrolüylenumberolduğunu doğrulayın.
Detaylı Öğrenmek İçin
Resmi doküman: TypeScript Handbook'un Everyday Types sayfası; bu dersteki tüm konuların kaynağı.1
Kitap: Matt Pocock'un çevrimiçi okunabilen Total TypeScript Essentials kitabının "Essential Types and Annotations" bölümü.12
Yazı: Dan Vanderkam'ın Effective TypeScript kitabından "Avoid Cluttering Your Code with Inferable Types" maddesi.3
Konuşma: Stefan Baumgartner'ın
any,unknownve tip kontrolünün kaçırdığı yerleri anlattığı "The Lies We Tell Ourselves Using TypeScript" konuşması (TypeScript Congress 2023, 28 dk).13Alıştırma: Matt Pocock'un ücretsiz, etkileşimli Beginner's TypeScript eğitimi (18 ders).14
Kaynaklar
Primitive tipler, array, `any`, type annotation, fonksiyonlar, literal tipler ve `as const`.
En iyi ortak tip (best common type) ve contextual typing.
: — Yerel değişkenlere değil fonksiyon imzalarına tip yazmak; dönüş tipinin faydası.
: — Üst seviye fonksiyonlara dönüş tipi yazmak, JSX döndüren component'ler hariç.
Tuple tipleri, opsiyonel ve `readonly` tuple'lar.
Fonksiyon tipi, opsiyonel ve varsayılan parametre, `void`, `unknown` ve `never`.
`null` ve `undefined`'ın ayrı tip olması; `strict` ile varsayılan açık.
8 Temmuz 2026; `strict`'in varsayılan olarak `true` olması.
Çıkarılamayan tipin `any`'ye düşmesini hataya çevirmek.
`unknown`'ın `any`'nin tip güvenli karşılığı olarak eklenmesi.
: — `unknown` ve `any` farkı, `never`, literal tipler.
: — Annotation, çıkarım, array, tuple ve fonksiyon tipleri; alıştırmalarıyla.
: — 28 dakika. `any`, `unknown`, `as` ve tip sisteminin kör noktaları.
: — Ücretsiz, 18 derslik etkileşimli eğitim; değişken, fonksiyon ve hata tipleri.
Last updated: October 17, 2026
