Bölüm 4: Object, Type ve Interface Kullanımı

Bu bölümde neler öğreneceğiz?
- Object tiplerini nasıl tanımlarız?
typeveinterfacenedir, farkları nelerdir?readonly,?gibi alanlar ne işe yarar?extendsve&ile nasıl genişletme yapılır?- Gerçek dünya örnekleriyle tüm kavramları pekiştirme
4.1 Object Tipleri Nedir?
JavaScript’te her şey nesnedir: kullanıcı, ürün, form verisi, bileşen props...
TypeScript ile bu nesnelerin yapısını önceden tanımlayarak daha güvenli ve okunabilir hale getirebiliriz.
1const user = {2name: "Yasin",3age: 26,4isAdmin: true,5};
Bunun için ya type ya da interface kullanırız.
4.2 type ile Object Tipi Tanımlama
1type User = {2name: string;3age: number;4isAdmin: boolean;5};
Artık User adında bir obje tipi oluşturduk.
1const admin: User = {2name: "Yasin",3age: 26,4isAdmin: true,5};
✅ Tüm alanlar doğru tipte olmalı. Eksik ya da fazla alan varsa TypeScript uyarır.
4.3 interface ile Object Tipi Tanımlama
1interface User {2name: string;3age: number;4isAdmin: boolean;5}
Kullanımı tamamen type ile aynıdır:
1const user: User = {2name: "Ali",3age: 30,4isAdmin: false,5};
4.4 type vs interface: Ne Farkları Var?
Her ikisi de objelerin şeklini tanımlar. Ama bazı teknik farkları vardır:
| Özellik | type | interface |
|---|---|---|
| Nesne tanımı | ✅ | ✅ |
| Union/Intersection | ✅ | ❌ sınırlı |
| Extend etme | ✅ | ✅ |
| Fonksiyon tipi | ✅ | ⛔ (sınırlı) |
| Daha esnek | ✅ | ⛔ |
| React'te props | ✅ | ✅ |
Genel kullanım önerisi:
interface➜ React props, class yapıları içintype➜ Veri yapıları, birleşik yapılar (union/intersection) için
Ama modern projelerde ikisini karıştırmak da yaygındır.
4.5 Opsiyonel Alanlar (?)
1type Product = {2id: number;3name: string;4description?: string; // opsiyonel alan5};67const p1: Product = { id: 1, name: "Mouse" }; // ✅ description yok8const p2: Product = { id: 2, name: "Klavye", description: "RGB" }; // ✅ var
? ile tanımlanan alanlar isteğe bağlıdır.
4.6 Readonly Alanlar
1interface Account {2readonly id: number;3name: string;4}56const acc: Account = { id: 101, name: "Yasin" };7// acc.id = 102; ❌ Error
✅ readonly alanlar bir kez atanır, sonra değiştirilemez.
➡️ Özellikle id, createdAt gibi değişmemesi gereken alanlarda kullanılır.
4.7 Genişletme – extends ve &
Interface Genişletme (extends)
1interface BaseUser {2name: string;3age: number;4}56interface AdminUser extends BaseUser {7role: "admin";8}910const admin: AdminUser = {11name: "Yasin",12age: 26,13role: "admin",14};
AdminUser, BaseUser'ın tüm alanlarını miras alır.
Type Birleşimi (& - Intersection)
1type Name = { name: string };2type Age = { age: number };34type Person = Name & Age;56const p: Person = {7name: "Yasin",8age: 26,9};
& iki tipin birleşimidir. Her iki tipin de tüm alanlarını ister.
4.8 Union Type ile Farklı Varyasyonlar
1type Theme = "light" | "dark" | "system";23function setTheme(theme: Theme) {4console.log("Tema ayarlandı:", theme);5}67setTheme("dark"); // ✅8setTheme("blue"); // ❌ Error
Bu yapı sadece 3 sabit değeri kabul eder. Hatalı değerler anında reddedilir.
Gerçek Uygulama: Kullanıcı Kartı
🎯 Amacımız: Kullanıcıyı ekranda gösteren tip güvenli bir bileşen.
types/User.ts
1export interface User {2id: number;3name: string;4age: number;5email?: string;6readonly createdAt: string;7}
components/UserCard.tsx
1import { User } from "../types/User";23export default function UserCard({ name, age, email }: User) {4return (5<div>6<h3>{name} ({age})</h3>7{email && <p>Email: {email}</p>}8</div>9);10}
App.tsx
1import UserCard from "./components/UserCard";23const user = {4id: 1,5name: "Yasin",6age: 26,7email: "yasin@example.com",8createdAt: "2023-01-01"9};1011export default function App() {12return <UserCard {...user} />;13}
✅ Props otomatik olarak tip güvenli hale geldi.
Alıştırmalar
Productadında birinterfaceoluştur:id,name,price,description?.Readonly>Product<kullanarak değişmez bir ürün oluştur.User'danemailalanı hariç her alanı içeren birUserPreviewtipi oluştur (Omit).AdminUser,GuestUserveRegisteredUsergibi extend edilen farklı kullanıcı rolleri oluştur.
Özet
| Konu | Açıklama |
|---|---|
type, interface | Nesne yapısı tanımlamak için kullanılır |
? | Opsiyonel alan |
readonly | Değiştirilemeyen alan |
extends / & | Tip genişletme / birleştirme |
Pick, Omit, Partial | Belirli alanları yönetme (utility types) |
| React Props | Genellikle interface ile tanımlanır |
Kazanımlar
- Object yapısını tip güvenli hale getirebilir
- Kendi
interfacevetypetanımlarını oluşturabilir - Genişletme, opsiyonellik, readonly gibi gelişmiş yapıları kullanabilir
- React component’lerinde sağlam
propstipleri tanımlayabilir