{"id":37669,"date":"2026-01-12T03:40:47","date_gmt":"2026-01-12T00:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37669"},"modified":"2026-01-12T03:40:47","modified_gmt":"2026-01-12T00:40:47","slug":"typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/","title":{"rendered":"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme, karma\u015f\u0131k sistemlerin y\u00f6netilebilir ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde in\u015fa edilmesini gerektirir. Bu noktada Nesne Y\u00f6nelimli Programlama (OOP) paradigmas\u0131, kodun daha mod\u00fcler, yeniden kullan\u0131labilir ve anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunar. TypeScript, JavaScript&#8217;in bir \u00fcst k\u00fcmesi (superset) olarak, OOP prensiplerini JavaScript ekosistemine tip g\u00fcvenli\u011fi ve geli\u015fmi\u015f yap\u0131sal \u00f6zelliklerle ta\u015f\u0131yarak geli\u015ftiricilere benzersiz avantajlar sunar. ECMAScript 2015 (ES6) ile JavaScript&#8217;e s\u0131n\u0131flar gelmi\u015f olsa da, TypeScript bu s\u0131n\u0131flar\u0131 eri\u015fim belirleyiciler, soyut s\u0131n\u0131flar, aray\u00fcz uygulamalar\u0131 ve daha fazlas\u0131 gibi ek \u00f6zelliklerle zenginle\u015ftirir.<\/p>\n<p>Bu makale, TypeScript&#8217;teki s\u0131n\u0131flar\u0131n temelden ileri seviyeye kadar nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 kapsaml\u0131 bir \u015fekilde ele alacakt\u0131r. S\u0131n\u0131f tan\u0131m\u0131ndan miras almaya, eri\u015fim belirleyicilerden soyut s\u0131n\u0131flara, aray\u00fcz uygulamalar\u0131ndan jenerik s\u0131n\u0131flara kadar bir\u00e7ok konuyu detayl\u0131 \u00f6rneklerle inceleyece\u011fiz. Amac\u0131m\u0131z, TypeScript&#8217;te sa\u011flam, \u00f6l\u00e7eklenebilir ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmek i\u00e7in s\u0131n\u0131flar\u0131 etkili bir \u015fekilde kullanma konusunda size rehberlik etmektir.<\/p>\n<h3>Temel S\u0131n\u0131f Tan\u0131m\u0131 ve Kullan\u0131m\u0131<\/h3>\n<p>TypeScript&#8217;te bir s\u0131n\u0131f, <code>class<\/code> anahtar kelimesi kullan\u0131larak tan\u0131mlan\u0131r. Bir s\u0131n\u0131f, nesnelerin bir \u015fablonu veya plan\u0131 gibidir; \u00f6zellikler (data) ve metotlar (davran\u0131\u015flar) i\u00e7erir. Bir s\u0131n\u0131ftan olu\u015fturulan her bir nesneye &#8220;\u00f6rnek&#8221; (instance) denir.<\/p>\n<h4>S\u0131n\u0131f \u00d6zellikleri (Properties)<\/h4>\n<p>S\u0131n\u0131f \u00f6zellikleri, s\u0131n\u0131f\u0131n durumunu veya verilerini temsil eden de\u011fi\u015fkenlerdir. Bir s\u0131n\u0131f\u0131n i\u00e7inde do\u011frudan tan\u0131mlan\u0131rlar.<\/p>\n<h4>S\u0131n\u0131f Metotlar\u0131 (Methods)<\/h4>\n<p>S\u0131n\u0131f metotlar\u0131, s\u0131n\u0131f\u0131n davran\u0131\u015flar\u0131n\u0131 veya i\u015flevselli\u011fini tan\u0131mlayan fonksiyonlard\u0131r.<\/p>\n<h4>Yap\u0131c\u0131 Metot (Constructor)<\/h4>\n<p>Yap\u0131c\u0131 metot, bir s\u0131n\u0131ftan yeni bir \u00f6rnek olu\u015fturuldu\u011funda otomatik olarak \u00e7a\u011fr\u0131lan \u00f6zel bir metottur. \u00d6rne\u011fe ba\u015flang\u0131\u00e7 de\u011ferleri atamak veya gerekli kurulum i\u015flemlerini yapmak i\u00e7in kullan\u0131l\u0131r. TypeScript&#8217;te bir s\u0131n\u0131f\u0131n yaln\u0131zca bir yap\u0131c\u0131 metodu olabilir. <code>constructor<\/code> anahtar kelimesi ile tan\u0131mlan\u0131r.<\/p>\n<p>Bir s\u0131n\u0131ftan \u00f6rnek olu\u015fturmak i\u00e7in <code>new<\/code> anahtar kelimesi kullan\u0131l\u0131r.<\/p>\n<p>\u0130\u015fte basit bir <code>Ki\u015fi<\/code> s\u0131n\u0131f\u0131 \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-typescript\">class Kisi {\n    ad: string;\n    soyad: string;\n    yas: number;\n\n    constructor(ad: string, soyad: string, yas: number) {\n        this.ad = ad;\n        this.soyad = soyad;\n        this.yas = yas;\n    }\n\n    tamAdGetir(): string {\n        return <code>${this.ad} ${this.soyad}<\/code>;\n    }\n\n    dogumYiliHesapla(): number {\n        const currentYear = new Date().getFullYear();\n        return currentYear - this.yas;\n    }\n}\n\n\/\/ S\u0131n\u0131ftan bir \u00f6rnek olu\u015fturma\nconst kisi1 = new Kisi(\"Ay\u015fe\", \"Y\u0131lmaz\", 30);\nconsole.log(kisi1.tamAdGetir()); \/\/ \u00c7\u0131kt\u0131: Ay\u015fe Y\u0131lmaz\nconsole.log(kisi1.dogumYiliHesapla()); \/\/ \u00c7\u0131kt\u0131: 1994 (e\u011fer y\u0131l 2024 ise)\n\nconst kisi2 = new Kisi(\"Mehmet\", \"Demir\", 25);\nconsole.log(kisi2.tamAdGetir()); \/\/ \u00c7\u0131kt\u0131: Mehmet Demir<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n&#8211; <code>ad<\/code>, <code>soyad<\/code> ve <code>yas<\/code> s\u0131n\u0131f\u0131n \u00f6zellikleridir.<br \/>\n&#8211; <code>constructor<\/code> metodu, yeni bir <code>Kisi<\/code> nesnesi olu\u015fturuldu\u011funda bu \u00f6zelliklere ba\u015flang\u0131\u00e7 de\u011ferleri atar.<br \/>\n&#8211; <code>tamAdGetir<\/code> ve <code>dogumYiliHesapla<\/code> metotlar\u0131, <code>Kisi<\/code> nesnelerinin ger\u00e7ekle\u015ftirebilece\u011fi eylemleri tan\u0131mlar.<br \/>\n&#8211; <code>this<\/code> anahtar kelimesi, s\u0131n\u0131f\u0131n mevcut \u00f6rne\u011fine at\u0131fta bulunur.<\/p>\n<h3>Eri\u015fim Belirleyiciler (Access Modifiers)<\/h3>\n<p>TypeScript, s\u0131n\u0131f \u00fcyelerinin (\u00f6zellikler ve metotlar) d\u0131\u015far\u0131dan ne kadar eri\u015filebilir oldu\u011funu kontrol etmek i\u00e7in eri\u015fim belirleyiciler sunar. Bunlar <code>public<\/code>, <code>private<\/code> ve <code>protected<\/code>&#8216;d\u0131r.<\/p>\n<h4><code>public<\/code><\/h4>\n<p><code>public<\/code> varsay\u0131lan eri\u015fim belirleyicidir. <code>public<\/code> olarak i\u015faretlenmi\u015f bir \u00fcye, s\u0131n\u0131f\u0131n i\u00e7inden, s\u0131n\u0131f\u0131n d\u0131\u015f\u0131ndan ve miras alan s\u0131n\u0131flardan eri\u015filebilir.<\/p>\n<pre><code class=\"language-typescript\">class Araba {\n    public marka: string;\n    model: string; \/\/ Varsay\u0131lan olarak public\n\n    constructor(marka: string, model: string) {\n        this.marka = marka;\n        this.model = model;\n    }\n\n    public bilgileriGoster(): string {\n        return <code>${this.marka} ${this.model}<\/code>;\n    }\n}\n\nconst araba1 = new Araba(\"Toyota\", \"Corolla\");\nconsole.log(araba1.marka); \/\/ Eri\u015filebilir\nconsole.log(araba1.model); \/\/ Eri\u015filebilir\nconsole.log(araba1.bilgileriGoster()); \/\/ Eri\u015filebilir<\/code><\/pre>\n<h4><code>private<\/code><\/h4>\n<p><code>private<\/code> olarak i\u015faretlenmi\u015f bir \u00fcye, yaln\u0131zca tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden eri\u015filebilir. S\u0131n\u0131f\u0131n d\u0131\u015f\u0131ndan veya miras alan s\u0131n\u0131flardan eri\u015filemez. Bu, bir s\u0131n\u0131f\u0131n i\u00e7 \u00e7al\u0131\u015fma detaylar\u0131n\u0131 gizlemek (encapsulation) i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">class BankaHesabi {\n    private hesapNo: string;\n    private bakiye: number;\n\n    constructor(hesapNo: string, baslangicBakiye: number) {\n        this.hesapNo = hesapNo;\n        this.bakiye = baslangicBakiye;\n    }\n\n    yatir(miktar: number): void {\n        if (miktar > 0) {\n            this.bakiye += miktar;\n            console.log(<code>${miktar} TL yat\u0131r\u0131ld\u0131. Yeni bakiye: ${this.bakiye} TL<\/code>);\n        } else {\n            console.log(\"Ge\u00e7ersiz miktar.\");\n        }\n    }\n\n    cek(miktar: number): void {\n        if (miktar > 0 && this.bakiye >= miktar) {\n            this.bakiye -= miktar;\n            console.log(<code>${miktar} TL \u00e7ekildi. Yeni bakiye: ${this.bakiye} TL<\/code>);\n        } else {\n            console.log(\"Yetersiz bakiye veya ge\u00e7ersiz miktar.\");\n        }\n    }\n\n    getBakiye(): number {\n        return this.bakiye;\n    }\n}\n\nconst hesap = new BankaHesabi(\"TR123456789\", 1000);\n\/\/ console.log(hesap.hesapNo); \/\/ Hata: 'hesapNo' private't\u0131r ve sadece 'BankaHesabi' s\u0131n\u0131f\u0131 i\u00e7inde eri\u015filebilir.\n\/\/ console.log(hesap.bakiye);   \/\/ Hata: 'bakiye' private't\u0131r.\n\nhesap.yatir(500);\nhesap.cek(200);\nconsole.log(<code>G\u00fcncel bakiye: ${hesap.getBakiye()} TL<\/code>); \/\/ Bakiye, public bir metot arac\u0131l\u0131\u011f\u0131yla eri\u015filebilir.<\/code><\/pre>\n<h4><code>protected<\/code><\/h4>\n<p><code>protected<\/code> olarak i\u015faretlenmi\u015f bir \u00fcye, tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden ve o s\u0131n\u0131ftan miras alan alt s\u0131n\u0131flar\u0131n i\u00e7inden eri\u015filebilir. S\u0131n\u0131f\u0131n d\u0131\u015f\u0131ndan eri\u015filemez.<\/p>\n<pre><code class=\"language-typescript\">class Calisan {\n    protected id: number;\n    public ad: string;\n\n    constructor(id: number, ad: string) {\n        this.id = id;\n        this.ad = ad;\n    }\n\n    protected getCalisanBilgisi(): string {\n        return <code>ID: ${this.id}, Ad: ${this.ad}<\/code>;\n    }\n}\n\nclass Yonetici extends Calisan {\n    departman: string;\n\n    constructor(id: number, ad: string, departman: string) {\n        super(id, ad); \/\/ \u00dcst s\u0131n\u0131f\u0131n constructor'\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r\n        this.departman = departman;\n    }\n\n    tamBilgileriGoster(): string {\n        \/\/ protected id'ye ve protected getCalisanBilgisi() metoduna eri\u015fim m\u00fcmk\u00fcn\n        return <code>${this.getCalisanBilgisi()}, Departman: ${this.departman}<\/code>;\n    }\n}\n\nconst yonetici = new Yonetici(101, \"Elif Can\", \"\u0130nsan Kaynaklar\u0131\");\nconsole.log(yonetici.ad); \/\/ Public oldu\u011fu i\u00e7in eri\u015filebilir\n\/\/ console.log(yonetici.id); \/\/ Hata: 'id' protected'd\u0131r.\n\/\/ console.log(yonetici.getCalisanBilgisi()); \/\/ Hata: 'getCalisanBilgisi' protected'd\u0131r.\nconsole.log(yonetici.tamBilgileriGoster()); \/\/ Metot i\u00e7inden protected \u00fcyelere eri\u015fim m\u00fcmk\u00fcn<\/code><\/pre>\n<h4>Constructor Parametrelerinde Eri\u015fim Belirleyiciler<\/h4>\n<p>TypeScript, yap\u0131c\u0131 metot parametrelerine eri\u015fim belirleyici ekleyerek s\u0131n\u0131f \u00f6zelliklerini otomatik olarak tan\u0131mlaman\u0131n ve ba\u015flatman\u0131n k\u0131sa bir yolunu sunar.<\/p>\n<pre><code class=\"language-typescript\">class Urun {\n    \/\/ markas\u0131 public, fiyat\u0131 private olarak otomatik tan\u0131mlan\u0131r ve ba\u015flat\u0131l\u0131r\n    constructor(public marka: string, private fiyat: number) {}\n\n    getFiyat(): number {\n        return this.fiyat;\n    }\n}\n\nconst telefon = new Urun(\"Samsung\", 12000);\nconsole.log(telefon.marka); \/\/ Samsung\n\/\/ console.log(telefon.fiyat); \/\/ Hata: 'fiyat' private't\u0131r.\nconsole.log(telefon.getFiyat()); \/\/ 12000<\/code><\/pre>\n<h3>Miras Alma (Inheritance)<\/h3>\n<p>Miras alma, bir s\u0131n\u0131f\u0131n ba\u015fka bir s\u0131n\u0131f\u0131n \u00f6zelliklerini ve metotlar\u0131n\u0131 devralmas\u0131n\u0131 sa\u011flayan bir OOP prensibidir. Bu, kodun yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r ve hiyerar\u015fik ili\u015fkiler kurmaya yard\u0131mc\u0131 olur. TypeScript&#8217;te miras alma, <code>extends<\/code> anahtar kelimesi ile ger\u00e7ekle\u015ftirilir. Miras alan s\u0131n\u0131fa &#8220;alt s\u0131n\u0131f&#8221; (subclass) veya &#8220;t\u00fcretilmi\u015f s\u0131n\u0131f&#8221; (derived class), miras verilen s\u0131n\u0131fa ise &#8220;\u00fcst s\u0131n\u0131f&#8221; (superclass) veya &#8220;temel s\u0131n\u0131f&#8221; (base class) denir.<\/p>\n<pre><code class=\"language-typescript\">class Hayvan {\n    isim: string;\n\n    constructor(isim: string) {\n        this.isim = isim;\n    }\n\n    sesCikar(): string {\n        return \"Bilinmeyen bir ses \u00e7\u0131kar\u0131yor.\";\n    }\n}\n\nclass Kedi extends Hayvan {\n    cins: string;\n\n    constructor(isim: string, cins: string) {\n        super(isim); \/\/ \u00dcst s\u0131n\u0131f\u0131n constructor'\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r\n        this.cins = cins;\n    }\n\n    \/\/ Metot ge\u00e7ersiz k\u0131lma (Method Overriding)\n    sesCikar(): string {\n        return \"Miyav!\";\n    }\n\n    avlan(): string {\n        return <code>${this.isim} (${this.cins}) avlan\u0131yor.<\/code>;\n    }\n}\n\nclass Kopek extends Hayvan {\n    constructor(isim: string) {\n        super(isim);\n    }\n\n    sesCikar(): string {\n        return \"Hav hav!\";\n    }\n}\n\nconst kedi = new Kedi(\"Pamuk\", \"Tekir\");\nconsole.log(kedi.isim); \/\/ Pamuk (Hayvan s\u0131n\u0131f\u0131ndan devral\u0131nd\u0131)\nconsole.log(kedi.sesCikar()); \/\/ Miyav! (Kedi s\u0131n\u0131f\u0131ndaki ge\u00e7ersiz k\u0131l\u0131nm\u0131\u015f metot)\nconsole.log(kedi.avlan()); \/\/ Pamuk (Tekir) avlan\u0131yor.\n\nconst kopek = new Kopek(\"Karaba\u015f\");\nconsole.log(kopek.isim); \/\/ Karaba\u015f\nconsole.log(kopek.sesCikar()); \/\/ Hav hav!\n\nconst hayvan = new Hayvan(\"Leo\");\nconsole.log(hayvan.sesCikar()); \/\/ Bilinmeyen bir ses \u00e7\u0131kar\u0131yor.<\/code><\/pre>\n<p><code>super()<\/code> anahtar kelimesi:<br \/>\n&#8211; Alt s\u0131n\u0131f\u0131n yap\u0131c\u0131 metodunda, \u00fcst s\u0131n\u0131f\u0131n yap\u0131c\u0131 metodunu \u00e7a\u011f\u0131rmak i\u00e7in kullan\u0131l\u0131r. Bu, \u00fcst s\u0131n\u0131f\u0131n \u00f6zelliklerinin do\u011fru bir \u015fekilde ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. <code>super()<\/code> \u00e7a\u011fr\u0131s\u0131, alt s\u0131n\u0131f\u0131n yap\u0131c\u0131 metodunun ilk i\u015flemi olmal\u0131d\u0131r.<br \/>\n&#8211; Alt s\u0131n\u0131fta, \u00fcst s\u0131n\u0131f\u0131n bir metodunu \u00e7a\u011f\u0131rmak i\u00e7in de <code>super.metotAdi()<\/code> \u015feklinde kullan\u0131labilir.<\/p>\n<h3>Soyut S\u0131n\u0131flar ve Metotlar (Abstract Classes and Methods)<\/h3>\n<p>Soyut s\u0131n\u0131flar, do\u011frudan \u00f6rnekleri olu\u015fturulamayan s\u0131n\u0131flard\u0131r. Genellikle, belirli bir ortak davran\u0131\u015f\u0131 tan\u0131mlayan ancak bu davran\u0131\u015f\u0131n tam uygulamas\u0131n\u0131 alt s\u0131n\u0131flara b\u0131rakan bir temel s\u0131n\u0131f sa\u011flamak i\u00e7in kullan\u0131l\u0131rlar. Bir s\u0131n\u0131f\u0131 soyut yapmak i\u00e7in <code>abstract<\/code> anahtar kelimesi kullan\u0131l\u0131r.<\/p>\n<h4>Soyut Metotlar<\/h4>\n<p>Soyut s\u0131n\u0131flar, soyut metotlar i\u00e7erebilir. Soyut metotlar, bir g\u00f6vdeye sahip olmayan ve sadece imzas\u0131n\u0131 (ad\u0131n\u0131, parametrelerini ve d\u00f6n\u00fc\u015f tipini) tan\u0131mlayan metotlard\u0131r. Alt s\u0131n\u0131flar, soyut s\u0131n\u0131ftan miras ald\u0131klar\u0131nda, t\u00fcm soyut metotlar\u0131 kendi uygulamalar\u0131yla birlikte sa\u011flamak zorundad\u0131r.<\/p>\n<pre><code class=\"language-typescript\">abstract class Sekil {\n    constructor(public renk: string) {}\n\n    abstract alanHesapla(): number; \/\/ Soyut metot, alt s\u0131n\u0131flar uygulamak zorunda\n    abstract cevreHesapla(): number; \/\/ Soyut metot\n\n    bilgiGoster(): string {\n        return <code>Bu bir ${this.renk} renkteki \u015fekildir.<\/code>;\n    }\n}\n\nclass Kare extends Sekil {\n    kenarUzunlugu: number;\n\n    constructor(renk: string, kenarUzunlugu: number) {\n        super(renk);\n        this.kenarUzunlugu = kenarUzunlugu;\n    }\n\n    alanHesapla(): number {\n        return this.kenarUzunlugu * this.kenarUzunlugu;\n    }\n\n    cevreHesapla(): number {\n        return 4 * this.kenarUzunlugu;\n    }\n}\n\nclass Daire extends Sekil {\n    yaricap: number;\n\n    constructor(renk: string, yaricap: number) {\n        super(renk);\n        this.yaricap = yaricap;\n    }\n\n    alanHesapla(): number {\n        return Math.PI <em> this.yaricap <\/em> this.yaricap;\n    }\n\n    cevreHesapla(): number {\n        return 2 <em> Math.PI <\/em> this.yaricap;\n    }\n}\n\n\/\/ const sekil = new Sekil(\"K\u0131rm\u0131z\u0131\"); \/\/ Hata: Soyut s\u0131n\u0131flar do\u011frudan \u00f6rneklenemez.\n\nconst kare = new Kare(\"Mavi\", 5);\nconsole.log(kare.bilgiGoster()); \/\/ Bu bir Mavi renkteki \u015fekildir.\nconsole.log(<code>Kare Alan: ${kare.alanHesapla()}<\/code>); \/\/ Kare Alan: 25\nconsole.log(<code>Kare \u00c7evre: ${kare.cevreHesapla()}<\/code>); \/\/ Kare \u00c7evre: 20\n\nconst daire = new Daire(\"Ye\u015fil\", 3);\nconsole.log(daire.bilgiGoster()); \/\/ Bu bir Ye\u015fil renkteki \u015fekildir.\nconsole.log(<code>Daire Alan: ${daire.alanHesapla()}<\/code>); \/\/ Daire Alan: 28.27...\nconsole.log(<code>Daire \u00c7evre: ${daire.cevreHesapla()}<\/code>); \/\/ Daire \u00c7evre: 18.84...<\/code><\/pre>\n<p>Soyut s\u0131n\u0131flar, farkl\u0131 alt s\u0131n\u0131flar\u0131n ortak bir aray\u00fcz\u00fc payla\u015fmas\u0131n\u0131 sa\u011flarken, ayn\u0131 zamanda baz\u0131 varsay\u0131lan uygulamalar veya ortak \u00f6zellikler sunarak kod tekrar\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>Aray\u00fczler (Interfaces) ve S\u0131n\u0131flar<\/h3>\n<p>TypeScript&#8217;te aray\u00fczler, bir nesnenin veya s\u0131n\u0131f\u0131n sahip olmas\u0131 gereken \u00f6zellik ve metot imzalar\u0131n\u0131 tan\u0131mlayan s\u00f6zle\u015fmelerdir. S\u0131n\u0131flar, <code>implements<\/code> anahtar kelimesini kullanarak bir veya daha fazla aray\u00fcz\u00fc uygulayabilir. Bir s\u0131n\u0131f bir aray\u00fcz\u00fc uygulad\u0131\u011f\u0131nda, aray\u00fczde tan\u0131mlanan t\u00fcm \u00f6zellikleri ve metotlar\u0131 kendi i\u00e7inde sa\u011flamak zorundad\u0131r.<\/p>\n<pre><code class=\"language-typescript\">interface Yazdirilabilir {\n    yazdir(): void;\n}\n\ninterface Kaydedilebilir {\n    kaydet(): void;\n}\n\nclass Rapor implements Yazdirilabilir, Kaydedilebilir {\n    baslik: string;\n    icerik: string;\n\n    constructor(baslik: string, icerik: string) {\n        this.baslik = baslik;\n        this.icerik = icerik;\n    }\n\n    yazdir(): void {\n        console.log(<code>Rapor Yazd\u0131r\u0131l\u0131yor: ${this.baslik}\\n${this.icerik}<\/code>);\n    }\n\n    kaydet(): void {\n        console.log(<code>Rapor Kaydediliyor: ${this.baslik}<\/code>);\n        \/\/ Veritaban\u0131na kaydetme veya dosya yazma mant\u0131\u011f\u0131 burada olabilir\n    }\n}\n\nclass Belge implements Yazdirilabilir {\n    ad: string;\n    sayfaSayisi: number;\n\n    constructor(ad: string, sayfaSayisi: number) {\n        this.ad = ad;\n        this.sayfaSayisi = sayfaSayisi;\n    }\n\n    yazdir(): void {\n        console.log(<code>Belge Yazd\u0131r\u0131l\u0131yor: ${this.ad}, Sayfa Say\u0131s\u0131: ${this.sayfaSayisi}<\/code>);\n    }\n}\n\nconst rapor = new Rapor(\"Y\u0131ll\u0131k Sat\u0131\u015f Raporu\", \"Bu rapor, ge\u00e7en y\u0131l\u0131n sat\u0131\u015f verilerini \u00f6zetlemektedir...\");\nrapor.yazdir();\nrapor.kaydet();\n\nconst belge = new Belge(\"Kullan\u0131m K\u0131lavuzu\", 50);\nbelge.yazdir();<\/code><\/pre>\n<p>Aray\u00fczler, polimorfizm i\u00e7in \u00e7ok \u00f6nemlidir ve kodunuzun daha esnek ve test edilebilir olmas\u0131n\u0131 sa\u011flar. Bir fonksiyonun, belirli bir aray\u00fcz\u00fc uygulayan herhangi bir s\u0131n\u0131f\u0131n \u00f6rne\u011fini kabul etmesini sa\u011flayabilirsiniz.<\/p>\n<h3>Statik \u00dcyeler (Static Members)<\/h3>\n<p>Statik \u00fcyeler (\u00f6zellikler ve metotlar), bir s\u0131n\u0131f\u0131n \u00f6rneklerine de\u011fil, do\u011frudan s\u0131n\u0131f\u0131n kendisine aittir. Bunlara s\u0131n\u0131f ad\u0131 \u00fczerinden eri\u015filir, bir s\u0131n\u0131f \u00f6rne\u011fi olu\u015fturmaya gerek yoktur. Statik \u00fcyeler genellikle yard\u0131mc\u0131 fonksiyonlar, sabitler veya bir s\u0131n\u0131f\u0131n t\u00fcm \u00f6rnekleri aras\u0131nda payla\u015f\u0131lan veriler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">class Matematik {\n    static PI: number = 3.14159; \/\/ Statik \u00f6zellik\n\n    static topla(a: number, b: number): number { \/\/ Statik metot\n        return a + b;\n    }\n\n    static carp(a: number, b: number): number {\n        return a * b;\n    }\n}\n\nconsole.log(Matematik.PI); \/\/ 3.14159\nconsole.log(Matematik.topla(5, 3)); \/\/ 8\nconsole.log(Matematik.carp(4, 2)); \/\/ 8\n\n\/\/ Statik olmayan bir \u00f6zellik veya metoda \u00f6rnek \u00fczerinden eri\u015filebilir\n\/\/ const mat = new Matematik(); \/\/ Hata: Matematik s\u0131n\u0131f\u0131 statik \u00fcyeler i\u00e7erdi\u011fi i\u00e7in \u00f6rneklenmesine gerek yok.<\/code><\/pre>\n<p>Statik metotlar, <code>this<\/code> anahtar kelimesini kullanarak s\u0131n\u0131f\u0131n statik \u00f6zelliklerine veya di\u011fer statik metotlar\u0131na eri\u015febilir, ancak s\u0131n\u0131f\u0131n \u00f6rnek \u00f6zelliklerine veya metotlar\u0131na eri\u015femezler.<\/p>\n<h3>Salt Okunur \u00d6zellikler (Readonly Properties)<\/h3>\n<p><code>readonly<\/code> anahtar kelimesi, bir s\u0131n\u0131f \u00f6zelli\u011finin yaln\u0131zca tan\u0131mland\u0131\u011f\u0131 yerde veya yap\u0131c\u0131 metot i\u00e7inde atanabilece\u011fini ve daha sonra de\u011fi\u015ftirilemeyece\u011fini belirtir. Bu, de\u011fi\u015fmez (immutable) veri \u00f6zelliklerini tan\u0131mlamak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">class Ayar {\n    readonly id: string;\n    public ayarAdi: string;\n    private readonly olusturmaTarihi: Date;\n\n    constructor(id: string, ayarAdi: string) {\n        this.id = id; \/\/ Yap\u0131c\u0131 metotta atanabilir\n        this.ayarAdi = ayarAdi;\n        this.olusturmaTarihi = new Date(); \/\/ Yap\u0131c\u0131 metotta atanabilir\n    }\n\n    \/\/ setId(newId: string): void {\n    \/\/     this.id = newId; \/\/ Hata: 'id' salt okunur bir \u00f6zelliktir.\n    \/\/ }\n\n    getOlusturmaTarihi(): Date {\n        return this.olusturmaTarihi;\n    }\n}\n\nconst genelAyar = new Ayar(\"GENEL_AYAR_1\", \"Uygulama Temas\u0131\");\nconsole.log(genelAyar.id); \/\/ GENEL_AYAR_1\n\/\/ genelAyar.id = \"YENI_ID\"; \/\/ Hata: 'id' salt okunur bir \u00f6zelliktir.\ngenelAyar.ayarAdi = \"Karanl\u0131k Tema\"; \/\/ ayarAdi public ve readonly de\u011fil, de\u011fi\u015ftirilebilir\nconsole.log(genelAyar.ayarAdi); \/\/ Karanl\u0131k Tema\nconsole.log(genelAyar.getOlusturmaTarihi()); \/\/ Tarih objesi<\/code><\/pre>\n<h3>Getter ve Setter Metotlar\u0131 (Eri\u015fimciler)<\/h3>\n<p>Getter (<code>get<\/code>) ve Setter (<code>set<\/code>) metotlar\u0131, bir s\u0131n\u0131f\u0131n \u00f6zelliklerine eri\u015fimi ve atamay\u0131 kontrol etmenizi sa\u011flar. Bu, veri do\u011frulama, yan etkileri y\u00f6netme veya dahili bir de\u011feri d\u0131\u015far\u0131ya farkl\u0131 bir formatta sunma gibi durumlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">class Kullanici {\n    private _yas: number;\n    public ad: string;\n\n    constructor(ad: string, yas: number) {\n        this.ad = ad;\n        this.yas = yas; \/\/ Setter \u00e7a\u011fr\u0131l\u0131r\n    }\n\n    \/\/ Getter: _yas \u00f6zelli\u011fine kontroll\u00fc eri\u015fim sa\u011flar\n    get yas(): number {\n        return this._yas;\n    }\n\n    \/\/ Setter: _yas \u00f6zelli\u011fine kontroll\u00fc atama yapar\n    set yas(yeniYas: number) {\n        if (yeniYas < 0 || yeniYas > 120) {\n            console.error(\"Ge\u00e7ersiz ya\u015f de\u011feri!\");\n            return;\n        }\n        this._yas = yeniYas;\n    }\n}\n\nconst kullanici = new Kullanici(\"Zeynep\", 30);\nconsole.log(kullanici.ad); \/\/ Zeynep\nconsole.log(kullanici.yas); \/\/ 30 (getter \u00e7a\u011fr\u0131ld\u0131)\n\nkullanici.yas = 25; \/\/ Setter \u00e7a\u011fr\u0131ld\u0131\nconsole.log(kullanici.yas); \/\/ 25\n\nkullanici.yas = 150; \/\/ Setter \u00e7a\u011fr\u0131ld\u0131, hata mesaj\u0131 bas\u0131l\u0131r\nconsole.log(kullanici.yas); \/\/ Hala 25, \u00e7\u00fcnk\u00fc atama ge\u00e7ersizdi<\/code><\/pre>\n<p>Getter ve setter&#8217;lar, \u00f6zelliklere do\u011frudan eri\u015fim yerine bir soyutlama katman\u0131 sa\u011flar, bu da s\u0131n\u0131f\u0131n i\u00e7 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmeden d\u0131\u015far\u0131ya sunulan aray\u00fcz\u00fc koruman\u0131za olanak tan\u0131r.<\/p>\n<h3>Jenerik S\u0131n\u0131flar (Generic Classes)<\/h3>\n<p>Jenerikler, bir s\u0131n\u0131f\u0131n veya fonksiyonun birden fazla tipte veriyle \u00e7al\u0131\u015fabilmesini sa\u011flarken, ayn\u0131 zamanda tip g\u00fcvenli\u011fini korumas\u0131na olanak tan\u0131r. Jenerik s\u0131n\u0131flar, farkl\u0131 veri tipleri \u00fczerinde \u00e7al\u0131\u015fan ancak ayn\u0131 mant\u0131\u011f\u0131 uygulayan s\u0131n\u0131flar olu\u015fturmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">class Depo<T> {\n    private ogeler: T[] = [];\n\n    ekle(oge: T): void {\n        this.ogeler.push(oge);\n    }\n\n    getOge(index: number): T | undefined {\n        return this.ogeler[index];\n    }\n\n    getTumOgeler(): T[] {\n        return this.ogeler;\n    }\n}\n\n\/\/ Say\u0131 depolayan bir depo\nconst sayiDeposu = new Depo<number>();\nsayiDeposu.ekle(10);\nsayiDeposu.ekle(20);\n\/\/ sayiDeposu.ekle(\"Merhaba\"); \/\/ Hata: 'string' tipi 'number' tipine atanamaz.\nconsole.log(sayiDeposu.getTumOgeler()); \/\/ [10, 20]\n\n\/\/ String depolayan bir depo\nconst stringDeposu = new Depo<string>();\nstringDeposu.ekle(\"Elma\");\nstringDeposu.ekle(\"Armut\");\nconsole.log(stringDeposu.getTumOgeler()); \/\/ [\"Elma\", \"Armut\"]\n\n\/\/ \u00d6zel bir obje depolayan depo\ninterface Kitap {\n    baslik: string;\n    yazar: string;\n}\n\nconst kitapDeposu = new Depo<Kitap>();\nkitapDeposu.ekle({ baslik: \"Sava\u015f ve Bar\u0131\u015f\", yazar: \"Lev Tolstoy\" });\nkitapDeposu.ekle({ baslik: \"Su\u00e7 ve Ceza\", yazar: \"Fyodor Dostoyevski\" });\nconsole.log(kitapDeposu.getOge(0)?.baslik); \/\/ Sava\u015f ve Bar\u0131\u015f<\/code><\/pre>\n<p>Jenerikler, kod tekrar\u0131n\u0131 azalt\u0131r ve daha esnek, yeniden kullan\u0131labilir bile\u015fenler olu\u015fturman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>S\u0131n\u0131flarda <code>this<\/code> Anahtar Kelimesi<\/h3>\n<p><code>this<\/code> anahtar kelimesi, JavaScript ve dolay\u0131s\u0131yla TypeScript&#8217;te s\u0131kl\u0131kla kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na neden olan bir konudur. Bir s\u0131n\u0131f metodunun i\u00e7inde <code>this<\/code>, o metodu \u00e7a\u011f\u0131ran s\u0131n\u0131f \u00f6rne\u011fine at\u0131fta bulunur. Ancak, metot bir olay dinleyicisi olarak veya ba\u015fka bir ba\u011flamda \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>this<\/code>&#8216;in de\u011feri de\u011fi\u015febilir.<\/p>\n<pre><code class=\"language-typescript\">class Buton {\n    etiket: string;\n\n    constructor(etiket: string) {\n        this.etiket = etiket;\n    }\n\n    tikla(): void {\n        console.log(<code>${this.etiket} t\u0131kland\u0131.<\/code>);\n    }\n\n    \/\/ Metodu farkl\u0131 bir ba\u011flamda \u00e7a\u011f\u0131rmak i\u00e7in\n    addEventListener(event: string, handler: Function): void {\n        \/\/ Normalde DOM olay dinleyicisi olurdu, burada sim\u00fcle ediyoruz\n        console.log(<code>Olay dinleyici eklendi: ${event}<\/code>);\n        \/\/ handler(); \/\/ E\u011fer b\u00f6yle \u00e7a\u011fr\u0131l\u0131rsa, 'this' buton nesnesi olmaz\n    }\n}\n\nconst myButton = new Buton(\"G\u00f6nder\");\nmyButton.tikla(); \/\/ \u00c7\u0131kt\u0131: G\u00f6nder t\u0131kland\u0131. (this = myButton)\n\n\/\/ Problem: E\u011fer metodu ba\u015fka bir fonksiyona callback olarak verirsek\nconst tiklaFonksiyonu = myButton.tikla;\n\/\/ tiklaFonksiyonu(); \/\/ Hata veya undefined: 'this' pencere objesi veya undefined olur.\n\n\/\/ \u00c7\u00f6z\u00fcm 1: Metodu ba\u011flamak (bind)\nconst bagliTiklaFonksiyonu = myButton.tikla.bind(myButton);\nbagliTiklaFonksiyonu(); \/\/ \u00c7\u0131kt\u0131: G\u00f6nder t\u0131kland\u0131.\n\n\/\/ \u00c7\u00f6z\u00fcm 2: Arrow fonksiyonlar\u0131 kullanmak\nclass ButonArrow {\n    etiket: string;\n\n    constructor(etiket: string) {\n        this.etiket = etiket;\n    }\n\n    \/\/ Arrow fonksiyonlar\u0131 'this' ba\u011flam\u0131n\u0131 tan\u0131mland\u0131klar\u0131 yere sabitler\n    tikla = (): void => {\n        console.log(<code>${this.etiket} t\u0131kland\u0131 (Arrow).<\/code>);\n    }\n}\n\nconst myButtonArrow = new ButonArrow(\"Kaydet\");\nconst tiklaArrowFonksiyonu = myButtonArrow.tikla;\ntiklaArrowFonksiyonu(); \/\/ \u00c7\u0131kt\u0131: Kaydet t\u0131kland\u0131 (Arrow). (this = myButtonArrow)<\/code><\/pre>\n<p>Arrow fonksiyonlar\u0131, <code>this<\/code>&#8216;in lexical scope&#8217;unu (tan\u0131mland\u0131\u011f\u0131 yerin ba\u011flam\u0131n\u0131) korudu\u011fu i\u00e7in, s\u0131n\u0131f metotlar\u0131nda <code>this<\/code> ba\u011flam\u0131 sorunlar\u0131n\u0131 \u00e7\u00f6zmek i\u00e7in s\u0131k\u00e7a tercih edilir.<\/p>\n<h3>S\u0131n\u0131flar\u0131n Di\u011fer TypeScript \u00d6zellikleriyle Etkile\u015fimi<\/h3>\n<p>TypeScript s\u0131n\u0131flar\u0131, dilin di\u011fer g\u00fc\u00e7l\u00fc \u00f6zellikleriyle birle\u015fti\u011finde daha da etkili hale gelir:<\/p>\n<p>*   <strong>Dekorat\u00f6rler (Decorators):<\/strong> Deneyimsel bir \u00f6zellik olmas\u0131na ra\u011fmen, dekorat\u00f6rler s\u0131n\u0131flar\u0131, metotlar\u0131, \u00f6zellikleri veya parametreleri de\u011fi\u015ftirmek i\u00e7in kullan\u0131labilir. Genellikle Angular gibi framework&#8217;lerde veya ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi kal\u0131plarda yayg\u0131n olarak kullan\u0131l\u0131rlar. \u00d6rne\u011fin, bir metodu otomatik olarak loglamak veya bir \u00f6zelli\u011fi belirli bir validasyon kural\u0131na tabi tutmak i\u00e7in dekorat\u00f6rler kullan\u0131labilir.<br \/>\n*   <strong>Mixins:<\/strong> TypeScript, JavaScript&#8217;in prototip tabanl\u0131 do\u011fas\u0131ndan faydalanarak s\u0131n\u0131flara birden fazla kaynaktan i\u015flevsellik &#8220;kar\u0131\u015ft\u0131rma&#8221; (mixin) yetene\u011fi sunar. Bu, \u00e7oklu kal\u0131t\u0131m\u0131n baz\u0131 faydalar\u0131n\u0131, JavaScript&#8217;in tek kal\u0131t\u0131m modelini bozmadan elde etmenizi sa\u011flar.<\/p>\n<p>Bu konular\u0131n her biri ayr\u0131 bir makale konusu olabilecek kadar geni\u015f kapsaml\u0131d\u0131r, ancak TypeScript s\u0131n\u0131flar\u0131n\u0131n ekosistemde nas\u0131l daha da g\u00fc\u00e7lendirilebilece\u011fini g\u00f6sterirler.<\/p>\n<h3>Neden TypeScript S\u0131n\u0131flar\u0131n\u0131 Kullanmal\u0131y\u0131z? (Avantajlar)<\/h3>\n<p>TypeScript s\u0131n\u0131flar\u0131n\u0131 kullanmak, bir\u00e7ok avantaj sunar:<\/p>\n<p>1.  <strong>Tip G\u00fcvenli\u011fi:<\/strong> S\u0131n\u0131f \u00f6zellikleri ve metot parametreleri i\u00e7in tip tan\u0131mlar\u0131, derleme zaman\u0131nda hatalar\u0131 yakalamaya yard\u0131mc\u0131 olur, bu da \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 azalt\u0131r.<br \/>\n2.  <strong>Kodun Okunabilirli\u011fi ve Bak\u0131m\u0131:<\/strong> S\u0131n\u0131flar, kodunuzu mant\u0131ksal birimlere ay\u0131rarak daha d\u00fczenli ve okunabilir hale getirir. OOP prensipleri sayesinde kodun bak\u0131m\u0131 ve geni\u015fletilmesi kolayla\u015f\u0131r.<br \/>\n3.  <strong>B\u00fcy\u00fck \u00d6l\u00e7ekli Uygulamalar \u0130\u00e7in Yap\u0131:<\/strong> Karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, s\u0131n\u0131flar kod taban\u0131n\u0131 organize etmek ve y\u00f6netmek i\u00e7in sa\u011flam bir yap\u0131 sunar.<br \/>\n4.  <strong>OOP Prensiplerini Uygulama Kolayl\u0131\u011f\u0131:<\/strong> Kaps\u00fclleme (encapsulation), miras alma (inheritance) ve polimorfizm (polymorphism) gibi OOP prensipleri, TypeScript s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla do\u011fal bir \u015fekilde uygulanabilir.<br \/>\n5.  <strong>Refactoring Kolayl\u0131\u011f\u0131:<\/strong> Tip bilgisi sayesinde IDE&#8217;ler, s\u0131n\u0131flar \u00fczerinde daha ak\u0131ll\u0131 refactoring ara\u00e7lar\u0131 sunabilir, bu da kodu g\u00fcvenli bir \u015fekilde yeniden yap\u0131land\u0131rmay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n6.  <strong>Geli\u015ftirici Deneyimi:<\/strong> Otomatik tamamlama, tip kontrol\u00fc ve an\u0131nda hata tespiti gibi \u00f6zellikler, geli\u015ftiricilerin daha h\u0131zl\u0131 ve hatas\u0131z kod yazmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>TypeScript&#8217;teki s\u0131n\u0131flar, modern JavaScript uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 ta\u015f\u0131d\u0131r. JavaScript&#8217;in ES6 s\u0131n\u0131flar\u0131na tip g\u00fcvenli\u011fi, eri\u015fim belirleyiciler, soyut s\u0131n\u0131flar ve aray\u00fcz uygulamalar\u0131 gibi \u00f6nemli \u00f6zellikler ekleyerek, TypeScript geli\u015ftiricilere daha sa\u011flam, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturma yetene\u011fi kazand\u0131r\u0131r.<\/p>\n<p>Bu makalede ele ald\u0131\u011f\u0131m\u0131z temel s\u0131n\u0131f tan\u0131mlar\u0131ndan miras almaya, eri\u015fim belirleyicilerden soyut s\u0131n\u0131flara, jeneriklerden getter\/setter metotlar\u0131na kadar bir\u00e7ok konu, TypeScript s\u0131n\u0131flar\u0131n\u0131n zenginli\u011fini ve g\u00fcc\u00fcn\u00fc g\u00f6stermektedir. Bu \u00f6zellikleri do\u011fru bir \u015fekilde anlamak ve uygulamak, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde kod kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. TypeScript s\u0131n\u0131flar\u0131n\u0131 etkili bir \u015fekilde kullanarak, nesne y\u00f6nelimli tasar\u0131m prensiplerini uygulamaya ve daha s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131m \u00e7\u00f6z\u00fcmleri geli\u015ftirmeye bir ad\u0131m daha yakla\u015fm\u0131\u015f olacaks\u0131n\u0131z.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nModern yaz\u0131l\u0131m geli\u015ftirme, karma\u015f\u0131k sistemlerin y\u00f6netilebilir ve s\u00fcr","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-37669","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>TypeScript&#039;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TypeScript&#039;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"TypeScript&#039;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme, karma\u015f\u0131k sistemlerin y\u00f6netilebilir ve s\u00fcr\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-12T00:40:47+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-12T00:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\"},\"wordCount\":2065,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\",\"name\":\"TypeScript'te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-12T00:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"TypeScript'te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"TypeScript'te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber","og_description":"TypeScript'te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme, karma\u015f\u0131k sistemlerin y\u00f6netilebilir ve s\u00fcr","og_url":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-12T00:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-12T00:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/"},"wordCount":2065,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/","name":"TypeScript'te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-12T00:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-siniflar-nasil-kullanilir-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TypeScript&#8217;te S\u0131n\u0131flar Nas\u0131l Kullan\u0131l\u0131r: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37669"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37669\/revisions"}],"predecessor-version":[{"id":37670,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37669\/revisions\/37670"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}