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

Bu bölümde neler öğreneceğiz?
- Object tiplerini nasıl tanımlarız?
type
veinterface
nedir, farkları nelerdir?readonly
,?
gibi alanlar ne işe yarar?extends
ve&
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
Product
adında birinterface
oluştur:id
,name
,price
,description?
.Readonly>Product<
kullanarak değişmez bir ürün oluştur.User
'danemail
alanı hariç her alanı içeren birUserPreview
tipi oluştur (Omit
).AdminUser
,GuestUser
veRegisteredUser
gibi 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
interface
vetype
tanımlarını oluşturabilir - Genişletme, opsiyonellik, readonly gibi gelişmiş yapıları kullanabilir
- React component’lerinde sağlam
props
tipleri tanımlayabilir