{"id":34101,"date":"2025-11-11T06:31:26","date_gmt":"2025-11-11T03:31:26","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/"},"modified":"2025-11-11T06:31:26","modified_gmt":"2025-11-11T03:31:26","slug":"arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/","title":{"rendered":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f"},"content":{"rendered":"<p>JavaScript ve TypeScript d\u00fcnyas\u0131nda arrow fonksiyonlar (ok fonksiyonlar\u0131), kod yaz\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftiren ve modern geli\u015ftirmede vazge\u00e7ilmez bir ara\u00e7 haline gelen g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Ancak, bu kompakt s\u00f6zdizimi \u00e7o\u011fu zaman &#8220;parantezleri ne zaman kullanmal\u0131y\u0131m?&#8221;, &#8220;s\u00fcsl\u00fc parantezlere ne zaman ihtiyac\u0131m var?&#8221; gibi sorular\u0131 da beraberinde getirir. Bu makale, TypeScript ba\u011flam\u0131nda arrow fonksiyonlar\u0131n\u0131n parantez kullan\u0131m\u0131n\u0131 derinlemesine inceleyecek, hem ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerin kafas\u0131ndaki soru i\u015faretlerini giderecek hem de deneyimli kullan\u0131c\u0131lar i\u00e7in pratik bilgiler sunacakt\u0131r. Amac\u0131m\u0131z, kodunuzu daha okunabilir, daha anla\u015f\u0131l\u0131r ve TypeScrip&#8217;in sundu\u011fu tip g\u00fcvenli\u011fi avantajlar\u0131ndan tam olarak yararlanan bir yap\u0131ya kavu\u015fturman\u0131za yard\u0131mc\u0131 olmakt\u0131r.<\/p>\n<h3>TypeScript&#8217;te Kodunuzu Daha Anla\u015f\u0131l\u0131r K\u0131lmak \u0130\u00e7in Parantezleri Do\u011fru Kullan\u0131n<\/h3>\n<p>Modern web geli\u015ftirme, s\u00fcrekli olarak daha temiz, daha \u00f6zl\u00fc ve daha i\u015flevsel kod yazma aray\u0131\u015f\u0131ndad\u0131r. ECMAScript 2015 (ES6) ile hayat\u0131m\u0131za giren arrow fonksiyonlar, bu hedefe ula\u015fmam\u0131zda bize \u00f6nemli bir ara\u00e7 sunmu\u015ftur. Geleneksel fonksiyon ifadelerine k\u0131yasla hem daha k\u0131sa bir s\u00f6zdizimine sahiptirler hem de <code>this<\/code> ba\u011flam\u0131n\u0131 daha sezgisel bir \u015fekilde y\u00f6netirler. Ancak, bu k\u0131salt\u0131lm\u0131\u015f s\u00f6zdizimi beraberinde baz\u0131 kafa kar\u0131\u015f\u0131kl\u0131klar\u0131n\u0131 da getirebilir. \u00d6zellikle parametre listesindeki parantezler ve fonksiyon g\u00f6vdesindeki s\u00fcsl\u00fc parantezler, ne zaman zorunlu olduklar\u0131, ne zaman atlanabilecekleri konusunda yeni ba\u015flayanlar i\u00e7in bir muamma olabilir. TypeScript&#8217;in tip g\u00fcvenli\u011fi katman\u0131 eklendi\u011finde ise bu durum, do\u011fru tip tan\u0131mlamalar\u0131yla daha da \u00f6nem kazan\u0131r.<\/p>\n<p>Bu makalede, arrow fonksiyonlar\u0131n\u0131n temel yap\u0131s\u0131ndan ba\u015flayarak, parantezlerin \u00e7e\u015fitli senaryolarda nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Tek parametreli fonksiyonlardan \u00e7ok parametreli ve destructuring kullanan karma\u015f\u0131k yap\u0131lara kadar her durumu ele alaca\u011f\u0131z. Fonksiyon g\u00f6vdesinde s\u00fcsl\u00fc parantezlerin kullan\u0131m\u0131, \u00f6rt\u00fcl\u00fc (implicit) ve a\u00e7\u0131k (explicit) d\u00f6n\u00fc\u015f de\u011ferleri aras\u0131ndaki farklar ve TypeScript&#8217;in bu senaryolarda tip \u00e7\u0131kar\u0131m\u0131 (type inference) yetene\u011fi \u00fczerinde duraca\u011f\u0131z. Ayr\u0131ca, <code>this<\/code> ba\u011flam\u0131n\u0131n arrow fonksiyonlarla nas\u0131l farkl\u0131la\u015ft\u0131\u011f\u0131n\u0131 ve bunun ger\u00e7ek d\u00fcnya uygulamalar\u0131nda ne anlama geldi\u011fini detayland\u0131raca\u011f\u0131z. Son olarak, s\u0131k\u00e7a yap\u0131lan hatalar\u0131 ve bu hatalardan ka\u00e7\u0131nmak i\u00e7in uygulanabilecek en iyi pratikleri listeleyecek, b\u00f6ylece TypeScript projelerinizde daha sa\u011flam ve bak\u0131m\u0131 kolay kodlar yazman\u0131za yard\u0131mc\u0131 olaca\u011f\u0131z.<\/p>\n<p>Amac\u0131m\u0131z, bu konudaki t\u00fcm belirsizlikleri ortadan kald\u0131rmak ve arrow fonksiyonlar\u0131n\u0131 tam potansiyeliyle kullanman\u0131z i\u00e7in size sa\u011flam bir temel sunmakt\u0131r. Bu sayede, hem kodunuzun okunabilirli\u011fini art\u0131racak hem de TypeScript&#8217;in sa\u011flad\u0131\u011f\u0131 tip g\u00fcvenli\u011fi avantajlar\u0131ndan tam olarak faydalanabileceksiniz. \u015eimdi bu derin dal\u0131\u015fa ba\u015flayal\u0131m ve arrow fonksiyonlar\u0131n\u0131n parantezlerle olan ili\u015fkisini ad\u0131m ad\u0131m ke\u015ffedelim.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: Kod okunabilirli\u011fi ve tutarl\u0131l\u0131k, k\u0131sa yaz\u0131m kolayl\u0131\u011f\u0131ndan daha \u00f6nemlidir. \u00d6zellikle tak\u0131m projelerinde net kurallar belirlemek, olas\u0131 kar\u0131\u015f\u0131kl\u0131klar\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n<h3>Arrow Fonksiyonlar\u0131n\u0131n Temelleri: Nereden Ba\u015flamal\u0131y\u0131z?<\/h3>\n<p>Arrow fonksiyonlar, ES6 (ECMAScript 2015) ile JavaScript&#8217;e eklenen ve fonksiyon ifadelerini daha k\u0131sa ve s\u00f6zdizimsel olarak daha temiz bir \u015fekilde yazmam\u0131z\u0131 sa\u011flayan bir \u00f6zelliktir. Geleneksel fonksiyon ifadelerinin yerini almas\u0131 ama\u00e7lanmam\u0131\u015ft\u0131r, ancak bir\u00e7ok durumda onlar\u0131n yerine tercih edilirler. En belirgin \u00f6zellikleri, <code>function<\/code> anahtar kelimesinin olmamas\u0131 ve <code>=><\/code> operat\u00f6r\u00fcn\u00fcn kullan\u0131lmas\u0131d\u0131r. Arrow fonksiyonlar\u0131 \u00f6zellikle callback (geri \u00e7a\u011f\u0131r\u0131m) fonksiyonlar\u0131 olarak veya fonksiyonel programlama paradigmalar\u0131nda yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<p>Peki, bir arrow fonksiyonunun temel yap\u0131s\u0131 nas\u0131ld\u0131r? Temelde \u00fc\u00e7 ana bile\u015feni vard\u0131r:<\/p>\n<p>1.  <strong>Parametre Listesi<\/strong>: Fonksiyonun alaca\u011f\u0131 arg\u00fcmanlar\u0131 tan\u0131mlar. Bu liste, parantez <code>()<\/code> i\u00e7inde yer al\u0131r.<br \/>\n2.  <strong>Ok Operat\u00f6r\u00fc<\/strong>: <code>=><\/code> sembol\u00fc, parametre listesi ile fonksiyon g\u00f6vdesi aras\u0131ndaki ba\u011flant\u0131y\u0131 g\u00f6sterir.<br \/>\n3.  <strong>Fonksiyon G\u00f6vdesi<\/strong>: Fonksiyonun ger\u00e7ekle\u015ftirece\u011fi i\u015flemleri i\u00e7erir. Bu g\u00f6vde, s\u00fcsl\u00fc parantez <code>{}<\/code> i\u00e7inde yer alabilir veya tek bir ifade ise atlanabilir.<\/p>\n<p>\u015eimdi bu temel yap\u0131y\u0131 farkl\u0131 senaryolarla inceleyelim:<\/p>\n<p>*   <strong>Parametresiz Arrow Fonksiyonlar<\/strong>: Hi\u00e7bir parametre almayan bir arrow fonksiyonu tan\u0131mlarken, parametre listesi i\u00e7in her zaman bo\u015f parantezler <code>()<\/code> kullanmak zorunludur.<\/p>\n<pre><code class=\"language-typescript\">const selamla = () => {\n        console.log(\"Merhaba D\u00fcnya!\");\n      };\n      selamla(); \/\/ \u00c7\u0131kt\u0131: Merhaba D\u00fcnya!<\/pre>\n<p><\/code><\/p>\n<p>    Burada <code>selamla<\/code> fonksiyonu hi\u00e7bir arg\u00fcman almad\u0131\u011f\u0131 i\u00e7in <code>()<\/code> kullan\u0131lm\u0131\u015ft\u0131r. S\u00fcsl\u00fc parantezler ise fonksiyon g\u00f6vdesinde birden fazla ifade veya yan etki (side effect) oldu\u011fu i\u00e7in gereklidir (\u00f6rne\u011fin, <code>console.log<\/code>).<\/p>\n<p>*   <strong>Tek Parametreli Arrow Fonksiyonlar<\/strong>: E\u011fer arrow fonksiyonunuz sadece bir parametre al\u0131yorsa ve bu parametreye bir tip tan\u0131mlamas\u0131 yapm\u0131yorsan\u0131z, parametre listesindeki parantezleri <code>()<\/code> atlayabilirsiniz. Bu, arrow fonksiyonlar\u0131n\u0131n en s\u0131k kullan\u0131lan ve en k\u0131sa halidir.<\/p>\n<pre><code class=\"language-typescript\">const karesiniAl = sayi => {\n        return sayi * sayi;\n      };\n      console.log(karesiniAl(5)); \/\/ \u00c7\u0131kt\u0131: 25<\/pre>\n<p><\/code><\/p>\n<p>    Yukar\u0131daki \u00f6rnekte <code>sayi<\/code> tek parametre oldu\u011fu i\u00e7in parantez kullan\u0131lmam\u0131\u015ft\u0131r. Ancak, e\u011fer bu <code>sayi<\/code> parametresine a\u00e7\u0131k\u00e7a bir tip atamas\u0131 yapmak isteseydik (ki TypeScript ile genellikle yapar\u0131z), o zaman parantezler zorunlu hale gelirdi. Bu konuya bir sonraki b\u00f6l\u00fcmde daha detayl\u0131 de\u011finece\u011fiz.<\/p>\n<p>*   <strong>Tek \u0130fadeli Fonksiyon G\u00f6vdeleri ve \u00d6rt\u00fcl\u00fc D\u00f6n\u00fc\u015f<\/strong>: Arrow fonksiyonlar\u0131n\u0131n bir di\u011fer pop\u00fcler \u00f6zelli\u011fi de, fonksiyon g\u00f6vdesinin sadece tek bir ifade i\u00e7erdi\u011fi durumlarda s\u00fcsl\u00fc parantezleri <code>{}<\/code> ve <code>return<\/code> anahtar kelimesini atlayabilmemizdir. Bu duruma \"\u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\" (implicit return) denir. Fonksiyon, ifadenin sonucunu otomatik olarak d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">const karesiniAlKisa = sayi => sayi * sayi;\n      console.log(karesiniAlKisa(7)); \/\/ \u00c7\u0131kt\u0131: 49\n    \n      const topla = (a, b) => a + b;\n      console.log(topla(3, 4)); \/\/ \u00c7\u0131kt\u0131: 7<\/pre>\n<p><\/code><\/p>\n<p>    <code>karesiniAlKisa<\/code> \u00f6rne\u011finde, <code>sayi * sayi<\/code> tek bir ifade oldu\u011fu i\u00e7in s\u00fcsl\u00fc parantezlere ve <code>return<\/code> anahtar kelimesine ihtiya\u00e7 duyulmam\u0131\u015ft\u0131r. <code>topla<\/code> fonksiyonunda ise birden fazla parametre oldu\u011fu i\u00e7in parametre listesindeki parantezler zorunludur, ancak yine tek ifade oldu\u011fu i\u00e7in g\u00f6vdede s\u00fcsl\u00fc parantezler ve <code>return<\/code> atlanm\u0131\u015ft\u0131r.<\/p>\n<p>Bu temel bilgilerle birlikte, arrow fonksiyonlar\u0131n\u0131n ne kadar esnek ve g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6rm\u00fc\u015f olmal\u0131s\u0131n\u0131z. Ancak, bu esneklik do\u011fru kullan\u0131lmad\u0131\u011f\u0131nda kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir. \u00d6zellikle TypeScript ile \u00e7al\u0131\u015f\u0131rken tip g\u00fcvenli\u011fini sa\u011flamak i\u00e7in parantezlerin do\u011fru kullan\u0131m\u0131 kritik \u00f6neme sahiptir. Bir sonraki b\u00f6l\u00fcmde, parametre y\u00f6netimi ve parantezlerin ne zaman kesinlikle zorunlu oldu\u011funa odaklanaca\u011f\u0131z. Bu sayede kodunuzu hem daha k\u0131sa hem de daha hatas\u0131z hale getirebileceksiniz.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: Tek ifadeli arrow fonksiyonlar\u0131, \u00f6zellikle <code>map<\/code>, <code>filter<\/code>, <code>reduce<\/code> gibi dizi metodlar\u0131yla birlikte kullan\u0131ld\u0131\u011f\u0131nda kodunuzu inan\u0131lmaz derecede temiz ve i\u015flevsel yapar.<\/p>\n<h3>Parametre Y\u00f6netimi: Parantezler Ne Zaman Zorunlu?<\/h3>\n<p>Arrow fonksiyonlar\u0131nda parametre listesindeki parantezlerin kullan\u0131m\u0131, fonksiyonun alaca\u011f\u0131 arg\u00fcmanlar\u0131n say\u0131s\u0131na, tiplerine ve yap\u0131lar\u0131na g\u00f6re de\u011fi\u015fiklik g\u00f6sterir. Bu b\u00f6l\u00fcm, parantezlerin zorunlu oldu\u011fu t\u00fcm senaryolar\u0131 a\u00e7\u0131kl\u0131\u011fa kavu\u015fturacak ve TypeScript ile nas\u0131l entegre edildi\u011fini g\u00f6sterecektir.<\/p>\n<p>*   <strong>S\u0131f\u0131r Parametre Durumu: Her Zaman Parantez Gerekli <code>()<\/code><\/strong><br \/>\n    Arrow fonksiyonu hi\u00e7bir parametre almad\u0131\u011f\u0131nda, parametre listesi her zaman bo\u015f parantezler <code>()<\/code> ile belirtilmelidir. Bu, fonksiyonun parametre almad\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6steren tek yoldur.<\/p>\n<pre><code class=\"language-typescript\">const calistirIslem = (): void => {\n        console.log(\"\u0130\u015flem ba\u015flat\u0131ld\u0131.\");\n        \/\/ Karma\u015f\u0131k bir i\u015flem...\n      };\n      calistirIslem(); \/\/ \u00c7\u0131kt\u0131: \u0130\u015flem ba\u015flat\u0131ld\u0131.<\/pre>\n<p><\/code><br \/>\n    Yukar\u0131daki \u00f6rnekte, <code>calistirIslem<\/code> fonksiyonu bir parametre almaz ve <code>void<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc belirtir. Bu nedenle <code>()<\/code> zorunludur.<\/p>\n<p>*   <strong>Birden Fazla Parametre Durumu: Her Zaman Parantez Gerekli <code>(param1, param2)<\/code><\/strong><br \/>\n    Arrow fonksiyonunuz iki veya daha fazla parametre al\u0131yorsa, parametre listesi mutlaka parantezler i\u00e7inde olmal\u0131d\u0131r. Parametreler virg\u00fcl ile ayr\u0131l\u0131r. TypeScript ile \u00e7al\u0131\u015f\u0131rken, bu parametrelere tip atamalar\u0131 da yapabiliriz.<\/p>\n<pre><code class=\"language-typescript\">const toplamHesapla = (sayi1: number, sayi2: number): number => {\n        return sayi1 + sayi2;\n      };\n      console.log(toplamHesapla(10, 20)); \/\/ \u00c7\u0131kt\u0131: 30\n    \n      const kullaniciBilgisiGoster = (ad: string, soyad: string, yas: number): void => {\n        console.log(<code>Ad: ${ad}, Soyad: ${soyad}, Ya\u015f: ${yas}<\/code>);\n      };\n      kullaniciBilgisiGoster(\"Can\", \"Y\u0131lmaz\", 30); \/\/ \u00c7\u0131kt\u0131: Ad: Can, Soyad: Y\u0131lmaz, Ya\u015f: 30<\/pre>\n<p><\/code><br \/>\n    Burada <code>toplamHesapla<\/code> ve <code>kullaniciBilgisiGoster<\/code> fonksiyonlar\u0131 birden fazla parametre ald\u0131\u011f\u0131 i\u00e7in parantezler <code>()<\/code> zorunludur. Ayr\u0131ca TypeScript ile parametre tipleri (<code>number<\/code>, <code>string<\/code>) ve d\u00f6n\u00fc\u015f tipi (<code>number<\/code>, <code>void<\/code>) belirtilmi\u015ftir.<\/p>\n<p>*   <strong>Tek Parametreye Tip Atamas\u0131 Durumu: Her Zaman Parantez Gerekli <code>(param: Type)<\/code><\/strong><br \/>\n    Daha \u00f6nce bahsetti\u011fimiz gibi, tek parametreli arrow fonksiyonlarda parametre listesindeki parantezleri atlamak m\u00fcmk\u00fcnd\u00fcr (<code>sayi => sayi * sayi<\/code>). Ancak, TypeScript kullanarak bu tek parametreye bir tip atamas\u0131 yapmak isterseniz, parantezleri kullanmak zorunludur.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Hatal\u0131 kullan\u0131m: Tek parametreye tip atan\u0131rken parantez atlanamaz\n      \/\/ const karesiniAlHata: (sayi: number) => number = sayi: number => sayi * sayi; \/\/ Syntax Error\n    \n      \/\/ Do\u011fru kullan\u0131m: Tek parametreye tip atan\u0131rken parantez zorunludur\n      const karesiniAlDogru = (sayi: number): number => sayi * sayi;\n      console.log(karesiniAlDogru(8)); \/\/ \u00c7\u0131kt\u0131: 64<\/pre>\n<p><\/code><br \/>\n    <code>karesiniAlDogru<\/code> \u00f6rne\u011finde, <code>sayi<\/code> parametresinin <code>number<\/code> tipinde oldu\u011funu belirtmek i\u00e7in <code>(sayi: number)<\/code> parantezleri kullan\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>*   <strong>Parametre Destructuring (Yap\u0131 Bozma) Durumu: Her Zaman Parantez Gerekli <code>({ prop1, prop2 })<\/code> veya <code>([item1, item2])<\/code><\/strong><br \/>\n    Parametre olarak bir nesnenin veya dizinin belirli \u00f6zelliklerini do\u011frudan almak i\u00e7in destructuring (yap\u0131 bozma) kullan\u0131ld\u0131\u011f\u0131nda, parametre listesi her zaman parantezler i\u00e7inde olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">interface Kullanici {\n        id: number;\n        ad: string;\n        eposta: string;\n      }\n    \n      const kullaniciBilgisiniYazdir = ({ ad, eposta }: Kullanici): void => {\n        console.log(<code>Kullan\u0131c\u0131 Ad\u0131: ${ad}, E-posta: ${eposta}<\/code>);\n      };\n    \n      const user: Kullanici = { id: 1, ad: \"Ay\u015fe\", eposta: \"ayse@example.com\" };\n      kullaniciBilgisiniYazdir(user); \/\/ \u00c7\u0131kt\u0131: Kullan\u0131c\u0131 Ad\u0131: Ay\u015fe, E-posta: ayse@example.com\n    \n      const ilkIkiElemaniYazdir = ([ilk, ikinci]: [string, string]): void => {\n        console.log(<code>\u0130lk: ${ilk}, \u0130kinci: ${ikinci}<\/code>);\n      };\n      ilkIkiElemaniYazdir([\"elma\", \"armut\"]); \/\/ \u00c7\u0131kt\u0131: \u0130lk: elma, \u0130kinci: armut<\/pre>\n<p><\/code><br \/>\n    Her iki destructuring \u00f6rne\u011finde de (<code>{ ad, eposta }<\/code> ve <code>[ilk, ikinci]<\/code>), parametre listesi parantezler i\u00e7inde olmak zorundad\u0131r.<\/p>\n<p>*   <strong>Rest Parametreleri Durumu: Her Zaman Parantez Gerekli <code>(...args)<\/code><\/strong><br \/>\n    Belirli say\u0131da olmayan arg\u00fcmanlar\u0131 bir dizi olarak yakalamak i\u00e7in rest parametreleri (<code>...<\/code>) kullan\u0131ld\u0131\u011f\u0131nda da parametre listesi parantez i\u00e7inde olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">const tumSayilariTopla = (...sayilar: number[]): number => {\n        return sayilar.reduce((toplam, mevcut) => toplam + mevcut, 0);\n      };\n      console.log(tumSayilariTopla(1, 2, 3, 4, 5)); \/\/ \u00c7\u0131kt\u0131: 15<\/pre>\n<p><\/code><br \/>\n    <code>tumSayilariTopla<\/code> fonksiyonu, <code>number<\/code> tipinde herhangi say\u0131da arg\u00fcman alabilir ve bunlar\u0131 <code>sayilar<\/code> dizisi olarak yakalar. Bu durumda da parantez kullan\u0131m\u0131 zorunludur.<\/p>\n<p>*   <strong>Varsay\u0131lan Parametreler Durumu: Her Zaman Parantez Gerekli <code>(param = &#039;default&#039;)<\/code><\/strong><br \/>\n    Bir parametreye varsay\u0131lan bir de\u011fer atand\u0131\u011f\u0131nda, parametre listesi her zaman parantezler i\u00e7inde olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">const selamlamaMesaji = (isim: string = \"Misafir\"): string => {\n        return <code>Merhaba, ${isim}!<\/code>;\n      };\n      console.log(selamlamaMesaji(\"Mehmet\")); \/\/ \u00c7\u0131kt\u0131: Merhaba, Mehmet!\n      console.log(selamlamaMesaji()); \/\/ \u00c7\u0131kt\u0131: Merhaba, Misafir!<\/pre>\n<p><\/code><br \/>\n    Burada <code>isim<\/code> parametresinin varsay\u0131lan de\u011feri oldu\u011fu i\u00e7in parantezler zorunludur.<\/p>\n<p>\u00d6zetle, arrow fonksiyonlar\u0131nda tek parametreli ve tip atanmam\u0131\u015f durumlar d\u0131\u015f\u0131nda parantezler (<code>()<\/code>) her zaman zorunludur. TypeScript ile \u00e7al\u0131\u015f\u0131rken, \u00e7o\u011fu zaman tip g\u00fcvenli\u011fi sa\u011flamak i\u00e7in parametrelerinize tip atayaca\u011f\u0131n\u0131zdan, tek parametreli durumlarda bile parantez kullanman\u0131z gerekecektir. Bu durum, kodunuzun hem daha tutarl\u0131 hem de daha g\u00fcvenli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>G\u00f6vde Yap\u0131s\u0131: Curly Brace'ler ve D\u00f6n\u00fc\u015f De\u011ferleri<\/h3>\n<p>Arrow fonksiyonlar\u0131n\u0131n g\u00f6vde yap\u0131s\u0131 da parantezlerin kullan\u0131m\u0131 kadar esnek ve bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabilir. Fonksiyonun ger\u00e7ekle\u015ftirece\u011fi i\u015flemin karma\u015f\u0131kl\u0131\u011f\u0131na g\u00f6re s\u00fcsl\u00fc parantezlerin <code>{}<\/code> kullan\u0131l\u0131p kullan\u0131lmayaca\u011f\u0131 ve <code>return<\/code> anahtar kelimesinin gerekip gerekmedi\u011fi belirlenir. Bu, \"\u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\" (implicit return) ve \"a\u00e7\u0131k d\u00f6n\u00fc\u015f\" (explicit return) kavramlar\u0131n\u0131 anlamakla yak\u0131ndan ili\u015fkilidir.<\/p>\n<p>*   <strong>\u00d6rt\u00fcl\u00fc D\u00f6n\u00fc\u015f (Implicit Return): S\u00fcsl\u00fc Parantezler Atlanabilir<\/strong><br \/>\n    E\u011fer arrow fonksiyonunun g\u00f6vdesi sadece tek bir ifade i\u00e7eriyorsa ve bu ifadenin sonucunu d\u00f6nd\u00fcrmek istiyorsan\u0131z, s\u00fcsl\u00fc parantezleri <code>{}<\/code> ve <code>return<\/code> anahtar kelimesini atlayabilirsiniz. Bu durumda fonksiyon, ifadenin de\u011ferlendirilmi\u015f sonucunu otomatik olarak d\u00f6nd\u00fcr\u00fcr. Bu, \u00f6zellikle k\u0131sa ve basit d\u00f6n\u00fc\u015f de\u011ferlerine sahip fonksiyonlar i\u00e7in kodun olduk\u00e7a okunabilir ve \u00f6zl\u00fc olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Tek parametre, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\n      const kareAl = (sayi: number): number => sayi * sayi;\n      console.log(kareAl(6)); \/\/ \u00c7\u0131kt\u0131: 36\n    \n      \/\/ \u0130ki parametre, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\n      const carp = (a: number, b: number): number => a * b;\n      console.log(carp(4, 5)); \/\/ \u00c7\u0131kt\u0131: 20<\/pre>\n<p><\/code><br \/>\n    Yukar\u0131daki \u00f6rneklerde, <code>kareAl<\/code> ve <code>carp<\/code> fonksiyonlar\u0131 tek bir matematiksel ifade i\u00e7erdi\u011finden, s\u00fcsl\u00fc parantezlere ve <code>return<\/code> ifadesine gerek kalmam\u0131\u015ft\u0131r. TypeScript, bu durumda d\u00f6n\u00fc\u015f tipini ifadeye g\u00f6re otomatik olarak \u00e7\u0131karabilir (<code>number<\/code>), ancak a\u00e7\u0131k\u00e7a belirtmek kod okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<p>*   <strong>A\u00e7\u0131k D\u00f6n\u00fc\u015f (Explicit Return): S\u00fcsl\u00fc Parantezler ve <code>return<\/code> Zorunlu<\/strong><br \/>\n    E\u011fer arrow fonksiyonunun g\u00f6vdesi birden fazla ifade i\u00e7eriyorsa, yan etkileri varsa (\u00f6rne\u011fin <code>console.log<\/code> \u00e7a\u011f\u0131rmak) veya karma\u015f\u0131k bir mant\u0131k y\u00fcr\u00fct\u00fcyorsa, s\u00fcsl\u00fc parantezleri <code>{}<\/code> kullanmak ve d\u00f6n\u00fc\u015f de\u011ferini a\u00e7\u0131k\u00e7a <code>return<\/code> anahtar kelimesiyle belirtmek zorunludur.<\/p>\n<pre><code class=\"language-typescript\">const islemYap = (deger: number): number => {\n        console.log(\"\u0130\u015flem ba\u015flat\u0131l\u0131yor...\");\n        const sonuc = deger * 2 + 5;\n        console.log(<code>Hesaplanan sonu\u00e7: ${sonuc}<\/code>);\n        return sonuc;\n      };\n      console.log(islemYap(10));\n      \/\/ \u00c7\u0131kt\u0131:\n      \/\/ \u0130\u015flem ba\u015flat\u0131l\u0131yor...\n      \/\/ Hesaplanan sonu\u00e7: 25\n      \/\/ 25<\/pre>\n<p><\/code><br \/>\n    Bu \u00f6rnekte, <code>islemYap<\/code> fonksiyonu hem <code>console.log<\/code> \u00e7a\u011fr\u0131lar\u0131 gibi yan etkilere sahiptir hem de birden fazla ad\u0131mda hesaplama yapar. Bu nedenle, s\u00fcsl\u00fc parantezler <code>{}<\/code> ve <code>return sonuc;<\/code> ifadesi zorunludur.<\/p>\n<p>*   <strong>Nesne Literallerini \u00d6rt\u00fcl\u00fc D\u00f6nd\u00fcrme: Ek Parantezler Neden Gerekli?<\/strong><br \/>\n    Bu, arrow fonksiyonlar\u0131 ile ilgili en yayg\u0131n kafa kar\u0131\u015f\u0131kl\u0131klar\u0131ndan biridir. E\u011fer bir arrow fonksiyonundan do\u011frudan bir nesne literalini (object literal) \u00f6rt\u00fcl\u00fc olarak d\u00f6nd\u00fcrmek isterseniz, nesne literalini \u00e7evreleyen ek parantezler <code>()<\/code> kullanman\u0131z gerekir. Aksi takdirde, JavaScript\/TypeScript s\u00fcsl\u00fc parantezleri bir fonksiyon g\u00f6vdesi blo\u011fu olarak yorumlar ve <code>return<\/code> ifadesi bekler.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Yanl\u0131\u015f kullan\u0131m: S\u00fcsl\u00fc parantezler fonksiyon g\u00f6vdesi olarak yorumlan\u0131r\n      \/\/ const kullaniciOlusturHata = (ad: string, yas: number) => { ad: ad, yas: yas };\n      \/\/ console.log(kullaniciOlusturHata(\"Ali\", 25)); \/\/ Hata: &#039;ad&#039; bir etiket olarak yorumlan\u0131r, d\u00f6n\u00fc\u015f de\u011feri yok.\n    \n      \/\/ Do\u011fru kullan\u0131m: Nesne literalini parantez i\u00e7ine alarak \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\n      interface Personel {\n        ad: string;\n        yas: number;\n        aktif: boolean;\n      }\n    \n      const kullaniciOlusturDogru = (ad: string, yas: number): Personel => ({ ad: ad, yas: yas, aktif: true });\n      console.log(kullaniciOlusturDogru(\"Veli\", 28));\n      \/\/ \u00c7\u0131kt\u0131: { ad: &#039;Veli&#039;, yas: 28, aktif: true }<\/pre>\n<p><\/code><br \/>\n    <code>kullaniciOlusturDogru<\/code> \u00f6rne\u011finde, <code>{ ad: ad, yas: yas, aktif: true }<\/code> nesne literalini <code>()<\/code> i\u00e7ine alarak, JavaScript'e bu s\u00fcsl\u00fc parantezlerin bir fonksiyon blo\u011fu de\u011fil, d\u00f6nd\u00fcr\u00fclecek bir nesne oldu\u011funu belirtmi\u015f oluyoruz. Bu, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\u00fcn g\u00fcc\u00fcn\u00fc kullan\u0131rken nesne d\u00f6nd\u00fcrmek i\u00e7in kritik bir detayd\u0131r.<\/p>\n<p>*   <strong><code>void<\/code> D\u00f6n\u00fc\u015f Tipi<\/strong><br \/>\n    TypeScript'te <code>void<\/code> d\u00f6n\u00fc\u015f tipi, fonksiyonun herhangi bir de\u011fer d\u00f6nd\u00fcrmedi\u011fini belirtmek i\u00e7in kullan\u0131l\u0131r. Bu genellikle yan etki olu\u015fturan veya sadece bir i\u015flemi ger\u00e7ekle\u015ftiren fonksiyonlar i\u00e7in ge\u00e7erlidir.<\/p>\n<pre><code class=\"language-typescript\">const logMesaji = (mesaj: string): void => {\n        console.log(<code>Log: ${mesaj}<\/code>);\n      };\n      logMesaji(\"Uygulama ba\u015flat\u0131ld\u0131.\"); \/\/ \u00c7\u0131kt\u0131: Log: Uygulama ba\u015flat\u0131ld\u0131.<\/pre>\n<p><\/code><br \/>\n    Burada <code>logMesaji<\/code> fonksiyonu bir de\u011fer d\u00f6nd\u00fcrmedi\u011fi i\u00e7in <code>void<\/code> olarak i\u015faretlenmi\u015ftir. Fonksiyon g\u00f6vdesi s\u00fcsl\u00fc parantez i\u00e7indedir \u00e7\u00fcnk\u00fc <code>console.log<\/code> bir yan etkidir ve bir d\u00f6n\u00fc\u015f de\u011feri yoktur.<\/p>\n<p>Bu b\u00f6l\u00fcmde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, arrow fonksiyonlar\u0131n\u0131n g\u00f6vdesinde s\u00fcsl\u00fc parantezlerin kullan\u0131m\u0131 ve <code>return<\/code> anahtar kelimesinin gereklili\u011fi, tamamen fonksiyonun ne yapt\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Tek bir ifadenin sonucunu d\u00f6nd\u00fcrmek istiyorsan\u0131z \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f \u00e7ok pratiktir, ancak daha karma\u015f\u0131k i\u015flemler veya yan etkiler s\u00f6z konusu oldu\u011funda a\u00e7\u0131k d\u00f6n\u00fc\u015f tercih edilmelidir. \u00d6zellikle nesne literallerini \u00f6rt\u00fcl\u00fc d\u00f6nd\u00fcr\u00fcrken ek parantezleri unutmamak, yayg\u0131n bir hatay\u0131 engellemenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: \u00d6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f, \u00f6zellikle <code>Array.prototype.map()<\/code> gibi y\u00fcksek dereceli fonksiyonlarla kullan\u0131ld\u0131\u011f\u0131nda kodunuzu \u00e7ok daha temiz hale getirir. Ancak, mant\u0131k karma\u015f\u0131kla\u015fmaya ba\u015flad\u0131\u011f\u0131nda a\u00e7\u0131k d\u00f6n\u00fc\u015fe ge\u00e7mekten \u00e7ekinmeyin.<\/p>\n<h3><code>this<\/code> Ba\u011flam\u0131 ve Arrow Fonksiyonlar\u0131n S\u00fcper G\u00fcc\u00fc<\/h3>\n<p>Arrow fonksiyonlar\u0131n\u0131n tan\u0131t\u0131lmas\u0131ndaki en \u00f6nemli motivasyonlardan biri, JavaScript'teki <code>this<\/code> anahtar kelimesinin kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davran\u0131\u015f\u0131n\u0131 ortadan kald\u0131rmakt\u0131. Geleneksel fonksiyonlarda <code>this<\/code>'in de\u011feri, fonksiyonun nas\u0131l \u00e7a\u011fr\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131 olarak de\u011fi\u015firken (invocation context), arrow fonksiyonlar\u0131 <code>this<\/code> ba\u011flam\u0131n\u0131 \"lexical\" olarak (tan\u0131mland\u0131\u011f\u0131 kapsamdan) miras al\u0131r. Bu, \u00f6zellikle s\u0131n\u0131f bile\u015fenlerinde veya olay i\u015fleyicilerinde b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar.<\/p>\n<p>*   <strong>Geleneksel Fonksiyonlarda <code>this<\/code> Problemi<\/strong><br \/>\n    Geleneksel bir fonksiyon i\u00e7inde <code>this<\/code>, fonksiyonun \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 nesneye veya global nesneye (taray\u0131c\u0131da <code>window<\/code>, Node.js'de <code>global<\/code>) i\u015faret eder. Bu durum, \u00f6zellikle bir s\u0131n\u0131f metodunu bir callback olarak ba\u015fka bir fonksiyona ge\u00e7irdi\u011finizde veya bir olaya ba\u011flad\u0131\u011f\u0131n\u0131zda sorunlara yol a\u00e7abilir. <code>this<\/code>, beklenmedik bir \u015fekilde ba\u011flam\u0131n\u0131 kaybedebilir.<\/p>\n<pre><code class=\"language-typescript\">class GelenekselSayac {\n        sayi: number = 0;\n    \n        arttirGecikmeli() {\n          setTimeout(function() {\n            \/\/ Burada &#039;this&#039; &#039;window&#039; (veya undefined strict mode&#039;da) i\u015faret eder, GelenekselSayac \u00f6rne\u011fine de\u011fil.\n            \/\/ Bu nedenle &#039;this.sayi&#039; hata verir veya beklenmeyen davran\u0131\u015f g\u00f6sterir.\n            \/\/ console.log(this.sayi); \/\/ Hata veya NaN\n            console.log(\"Geleneksel Fonksiyonda this:\", this);\n          }, 1000);\n        }\n      }\n    \n      const gelenekselOrnek = new GelenekselSayac();\n      gelenekselOrnek.arttirGecikmeli();\n      \/\/ \u00c7\u0131kt\u0131 (yakla\u015f\u0131k 1 saniye sonra): Geleneksel Fonksiyonda this: Window {} (taray\u0131c\u0131da)<\/pre>\n<p><\/code><br \/>\n    Bu sorunu \u00e7\u00f6zmek i\u00e7in <code>bind()<\/code>, <code>call()<\/code>, <code>apply()<\/code> gibi y\u00f6ntemler veya <code>self = this<\/code> gibi ge\u00e7ici de\u011fi\u015fkenler kullanmak gerekirdi ki bu da kodu daha karma\u015f\u0131k hale getirirdi.<\/p>\n<p>*   <strong>Arrow Fonksiyonlarda Lexical <code>this<\/code> Ba\u011flam\u0131<\/strong><br \/>\n    Arrow fonksiyonlar, kendi <code>this<\/code> ba\u011flamlar\u0131n\u0131 olu\u015fturmazlar. Bunun yerine, tan\u0131mland\u0131klar\u0131 yerdeki (lexical scope) <code>this<\/code> de\u011ferini miras al\u0131rlar. Bu, bir s\u0131n\u0131f metodunun i\u00e7inde tan\u0131mlanan bir arrow fonksiyonunun, o metodun ait oldu\u011fu s\u0131n\u0131f \u00f6rne\u011finin <code>this<\/code> de\u011ferini koruyaca\u011f\u0131 anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-typescript\">class ModernSayac {\n        sayi: number = 0;\n    \n        arttirGecikmeli() {\n          setTimeout(() => {\n            \/\/ Arrow fonksiyonu, tan\u0131mland\u0131\u011f\u0131 yerdeki &#039;this&#039;i (ModernSayac \u00f6rne\u011fi) miras al\u0131r.\n            this.sayi++;\n            console.log(\"G\u00fcncel Say\u0131:\", this.sayi);\n          }, 1000);\n        }\n    \n        basla() {\n          console.log(\"Sayac Ba\u015flat\u0131ld\u0131.\");\n          this.arttirGecikmeli();\n          this.arttirGecikmeli();\n        }\n      }\n    \n      const modernOrnek = new ModernSayac();\n      modernOrnek.basla();\n      \/\/ \u00c7\u0131kt\u0131 (yakla\u015f\u0131k 1 saniye sonra): G\u00fcncel Say\u0131: 1\n      \/\/ \u00c7\u0131kt\u0131 (yakla\u015f\u0131k 1 saniye sonra): G\u00fcncel Say\u0131: 2<\/pre>\n<p><\/code><br \/>\n    Bu \u00f6rnekte, <code>setTimeout<\/code> i\u00e7indeki arrow fonksiyonu, <code>arttirGecikmeli<\/code> metodunun ait oldu\u011fu <code>ModernSayac<\/code> s\u0131n\u0131f \u00f6rne\u011finin <code>this<\/code>'ini do\u011fru bir \u015fekilde i\u015faret eder. Bu sayede <code>this.sayi<\/code> g\u00fcvenli bir \u015fekilde g\u00fcncellenebilir.<\/p>\n<p>*   <strong>Ger\u00e7ek D\u00fcnya Uygulamalar\u0131 ve <code>this<\/code><\/strong><\/p>\n<p>    1.  <strong>React Bile\u015fenlerinde Olay \u0130\u015fleyicileri<\/strong>: React'ta s\u0131n\u0131f bile\u015fenleri kullan\u0131rken, olay i\u015fleyicilerini arrow fonksiyonlar olarak tan\u0131mlamak, <code>this<\/code> ba\u011flam\u0131n\u0131 otomatik olarak bile\u015fen \u00f6rne\u011fine ba\u011flar ve <code>bind()<\/code> metodunu kullanma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ React Bile\u015feni \u00d6rne\u011fi (s\u00f6zde kod)\n          class MyButton extends React.Component {\n            state = { count: 0 };\n          \n            \/\/ Arrow fonksiyon kullanarak this ba\u011flam\u0131n\u0131 koruma\n            handleClick = () => {\n              this.setState({ count: this.state.count + 1 });\n            };\n          \n            render() {\n              return (\n                <button onClick={this.handleClick}>\n                  T\u0131kland\u0131: {this.state.count} kez\n                <\/button>\n              );\n            }\n          }<\/pre>\n<p><\/code><br \/>\n        <code>handleClick<\/code> metodu bir arrow fonksiyonu olarak tan\u0131mland\u0131\u011f\u0131 i\u00e7in, <code>this.setState<\/code> i\u00e7indeki <code>this<\/code> do\u011fru bir \u015fekilde <code>MyButton<\/code> bile\u015fen \u00f6rne\u011fine i\u015faret eder.<\/p>\n<p>    2.  <strong>Promise Zincirleri<\/strong>: Asenkron i\u015flemlerde <code>Promise.then()<\/code> veya <code>Promise.catch()<\/code> i\u00e7inde arrow fonksiyonlar\u0131 kullanmak, d\u0131\u015f kapsamdaki <code>this<\/code>'i kolayca eri\u015filebilir k\u0131lar.<\/p>\n<pre><code class=\"language-typescript\">class VeriServisi {\n            apiUrl: string = \"https:\/\/api.example.com\/data\";\n          \n            fetchData(): Promise<any> {\n              return fetch(this.apiUrl)\n                .then(response => response.json()) \/\/ Arrow fonksiyon, this.apiUrl&#039;a eri\u015fim ihtiyac\u0131 yok, ama this olsayd\u0131 eri\u015filebilirdi.\n                .then(data => {\n                  console.log(\"Veri \u00e7ekildi:\", data);\n                  \/\/ E\u011fer bu fonksiyonda s\u0131n\u0131f\u0131n &#039;this&#039;ini kullanmak isteseydik, sorun olmazd\u0131.\n                  this.processData(data); \n                  return data;\n                })\n                .catch(error => {\n                  console.error(\"Hata olu\u015ftu:\", error);\n                  throw error; \/\/ Hatay\u0131 ilet\n                });\n            }\n          \n            processData(data: any) {\n              \/\/ &#039;this&#039; burada VeriServisi \u00f6rne\u011fine i\u015faret eder.\n              console.log(<code>Veriler ${this.apiUrl} adresinden i\u015flendi.<\/code>);\n            }\n          }\n          \n          const servis = new VeriServisi();\n          servis.fetchData();<\/pre>\n<p><\/code><br \/>\n        Bu \u00f6rnekte, <code>then<\/code> ve <code>catch<\/code> bloklar\u0131ndaki arrow fonksiyonlar\u0131, <code>VeriServisi<\/code> s\u0131n\u0131f\u0131n\u0131n <code>this<\/code> ba\u011flam\u0131n\u0131 koruyarak, <code>this.processData()<\/code> veya gelecekte <code>this.someOtherMethod()<\/code> gibi \u00e7a\u011fr\u0131lar\u0131 sorunsuz hale getirir.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: Arrow fonksiyonlar\u0131 <code>this<\/code> ba\u011flam\u0131 sorununu \u00e7\u00f6zerken, kendi <code>arguments<\/code> objelerini olu\u015fturmazlar. E\u011fer bir fonksiyonda <code>arguments<\/code> objesine ihtiyac\u0131n\u0131z varsa, geleneksel fonksiyonlar\u0131 kullanmal\u0131 veya rest parametrelerini tercih etmelisiniz.<\/p>\n<p>Arrow fonksiyonlar\u0131n\u0131n <code>this<\/code> ba\u011flam\u0131n\u0131 lexical olarak ele almas\u0131, JavaScript'in en kafa kar\u0131\u015ft\u0131r\u0131c\u0131 \u00f6zelliklerinden birini \u00e7\u00f6zerek kodumuzu daha tahmin edilebilir ve daha az hataya a\u00e7\u0131k hale getirmi\u015ftir. Bu, \u00f6zellikle callback tabanl\u0131 veya olay odakl\u0131 programlamada b\u00fcy\u00fck bir avantaj sa\u011flar.<\/p>\n<h3>TypeScript ile Gelen Art\u0131lar: Tip G\u00fcvenli\u011fi ve Daha Fazlas\u0131<\/h3>\n<p>TypeScript, JavaScript'e statik tip denetimi ekleyerek b\u00fcy\u00fck projelerde \u00f6l\u00e7eklenebilirli\u011fi, bak\u0131m\u0131 kolayl\u0131\u011f\u0131 ve hata ay\u0131klamay\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftiren bir s\u00fcper settir. Arrow fonksiyonlar, TypeScript ile birlikte kullan\u0131ld\u0131\u011f\u0131nda bu avantajlar\u0131 daha da belirgin hale getirir. Tip ek a\u00e7\u0131klamalar\u0131 (type annotations), tip \u00e7\u0131kar\u0131m\u0131 (type inference) ve jenerikler (generics) gibi \u00f6zellikler, arrow fonksiyonlar\u0131n\u0131 daha g\u00fc\u00e7l\u00fc ve g\u00fcvenli hale getirir.<\/p>\n<p>*   <strong>Tip Ek A\u00e7\u0131klamalar\u0131 (Type Annotations)<\/strong><br \/>\n    TypeScript, arrow fonksiyonlar\u0131n\u0131n parametrelerine ve d\u00f6n\u00fc\u015f de\u011ferlerine tip ek a\u00e7\u0131klamalar\u0131 yapmam\u0131za olanak tan\u0131r. Bu sayede fonksiyonun hangi tiplerde arg\u00fcmanlar bekledi\u011fini ve hangi tipte bir de\u011fer d\u00f6nd\u00fcrece\u011fini a\u00e7\u0131k\u00e7a belirtiriz. Bu, kodun hem okunabilirli\u011fini art\u0131r\u0131r hem de potansiyel hatalar\u0131 derleme zaman\u0131nda yakalamam\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Parametre tipleri ve d\u00f6n\u00fc\u015f tipi a\u00e7\u0131k\u00e7a belirtilmi\u015f\n      const topla = (a: number, b: number): number => {\n        return a + b;\n      };\n      console.log(topla(5, 3)); \/\/ \u00c7\u0131kt\u0131: 8\n    \n      \/\/ Bir string dizisini alan ve her eleman\u0131 b\u00fcy\u00fck harfe \u00e7eviren bir fonksiyon\n      const buyukHarfeCevir = (kelimeler: string[]): string[] => {\n        return kelimeler.map(kelime => kelime.toUpperCase());\n      };\n      console.log(buyukHarfeCevir([\"elma\", \"armut\"])); \/\/ \u00c7\u0131kt\u0131: [ &#039;ELMA&#039;, &#039;ARMUT&#039; ]<\/pre>\n<p><\/code><br \/>\n    Yukar\u0131daki \u00f6rneklerde, <code>topla<\/code> fonksiyonu iki <code>number<\/code> parametresi al\u0131r ve bir <code>number<\/code> d\u00f6nd\u00fcr\u00fcr. <code>buyukHarfeCevir<\/code> ise bir <code>string[]<\/code> al\u0131r ve bir <code>string[]<\/code> d\u00f6nd\u00fcr\u00fcr. Bu a\u00e7\u0131klamalar sayesinde, yanl\u0131\u015f tipte bir arg\u00fcman ge\u00e7ildi\u011finde TypeScript hemen bizi uyar\u0131r.<\/p>\n<p>*   <strong>Tip \u00c7\u0131kar\u0131m\u0131 (Type Inference)<\/strong><br \/>\n    TypeScript'in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri tip \u00e7\u0131kar\u0131m\u0131d\u0131r. Her zaman a\u00e7\u0131k\u00e7a tip belirtmek zorunda kalmay\u0131z; TypeScript \u00e7o\u011fu durumda tipleri otomatik olarak \u00e7\u0131karabilir. Bu, \u00f6zellikle arrow fonksiyonlar\u0131nda kodun daha k\u0131sa ve okunabilir kalmas\u0131na yard\u0131mc\u0131 olurken, ayn\u0131 zamanda tip g\u00fcvenli\u011finden \u00f6d\u00fcn vermez.<\/p>\n<pre><code class=\"language-typescript\">\/\/ TypeScript, a ve b&#039;nin number oldu\u011funu, toplam\u0131n da number oldu\u011funu \u00e7\u0131kar\u0131r\n      const cikar = (a, b) => a - b;\n      console.log(cikar(10, 4)); \/\/ \u00c7\u0131kt\u0131: 6\n      \/\/ cikar(\"hello\", 4); \/\/ TypeScript derleme hatas\u0131 verecektir: Argument of type &#039;string&#039; is not assignable to parameter of type &#039;number&#039;.\n    \n      \/\/ Bir nesneden property \u00e7eken fonksiyon\n      interface Urun {\n        ad: string;\n        fiyat: number;\n      }\n      const urunAdiGetir = (urun: Urun) => urun.ad; \/\/ TypeScript, &#039;urun&#039;\u00fcn &#039;Urun&#039; tipinde oldu\u011funu ve &#039;ad&#039;in &#039;string&#039; d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc \u00e7\u0131kar\u0131r.\n    \n      const myProduct: Urun = { ad: \"Kitap\", fiyat: 25 };\n      console.log(urunAdiGetir(myProduct)); \/\/ \u00c7\u0131kt\u0131: Kitap<\/pre>\n<p><\/code><br \/>\n    <code>cikar<\/code> fonksiyonunda a\u00e7\u0131k\u00e7a tip belirtilmemesine ra\u011fmen, ilk \u00e7a\u011fr\u0131m s\u0131ras\u0131nda <code>number<\/code> tipleri kullan\u0131ld\u0131\u011f\u0131ndan TypeScript <code>a<\/code> ve <code>b<\/code>'nin <code>number<\/code> oldu\u011funu varsayar. Daha sonra bir <code>string<\/code> ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda hata verir. <code>urunAdiGetir<\/code> \u00f6rne\u011finde ise <code>urun<\/code> parametresine <code>Urun<\/code> tipi atand\u0131\u011f\u0131 i\u00e7in, <code>urun.ad<\/code>'in <code>string<\/code> oldu\u011fu otomatik olarak \u00e7\u0131kar\u0131l\u0131r.<\/p>\n<p>*   <strong>Jenerikler (Generics) ile Arrow Fonksiyonlar<\/strong><br \/>\n    Jenerikler, tip g\u00fcvenli\u011fini korurken fonksiyonlar\u0131 ve s\u0131n\u0131flar\u0131 \u00e7e\u015fitli tiplerle \u00e7al\u0131\u015fabilecek \u015fekilde yazmam\u0131z\u0131 sa\u011flar. Arrow fonksiyonlar\u0131 da jenerik tiplerle birlikte kullan\u0131labilir, bu da onlar\u0131 daha esnek ve yeniden kullan\u0131labilir hale getirir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Herhangi bir tipte bir de\u011feri al\u0131p ayn\u0131 tipte d\u00f6nd\u00fcren jenerik arrow fonksiyon\n      const kimlik = <T>(deger: T): T => deger;\n    \n      let sayiSonuc: number = kimlik(123); \/\/ T, number olarak \u00e7\u0131kar\u0131l\u0131r\n      let metinSonuc: string = kimlik(\"Merhaba\"); \/\/ T, string olarak \u00e7\u0131kar\u0131l\u0131r\n      let diziSonuc: string[] = kimlik([\"a\", \"b\"]); \/\/ T, string[] olarak \u00e7\u0131kar\u0131l\u0131r\n    \n      console.log(sayiSonuc, metinSonuc, diziSonuc); \/\/ \u00c7\u0131kt\u0131: 123 Merhaba [ &#039;a&#039;, &#039;b&#039; ]\n    \n      \/\/ Bir diziyi ters \u00e7eviren jenerik arrow fonksiyon\n      const tersCevir = <U>(dizi: U[]): U[] => [...dizi].reverse();\n    \n      console.log(tersCevir([1, 2, 3])); \/\/ \u00c7\u0131kt\u0131: [ 3, 2, 1 ]\n      console.log(tersCevir([\"x\", \"y\", \"z\"])); \/\/ \u00c7\u0131kt\u0131: [ &#039;z&#039;, &#039;y&#039;, &#039;x&#039; ]<\/pre>\n<p><\/code><br \/>\n    <code>kimlik<\/code> fonksiyonu, <code><T><\/code> jenerik tip parametresi sayesinde herhangi bir tipte de\u011feri kabul edebilir ve ayn\u0131 tipte geri d\u00f6nd\u00fcrebilir. <code>tersCevir<\/code> fonksiyonu da benzer \u015fekilde herhangi bir tipteki diziyi al\u0131p o tipteki elemanlar\u0131 i\u00e7eren ters \u00e7evrilmi\u015f bir dizi d\u00f6nd\u00fcr\u00fcr. Bu, kodun tekrar kullan\u0131labilirli\u011fini art\u0131r\u0131rken tip g\u00fcvenli\u011fini de sa\u011flar.<\/p>\n<p>*   <strong><code>void<\/code> D\u00f6n\u00fc\u015f Tipi ve Hata Yakalama<\/strong><br \/>\n    TypeScript'te <code>void<\/code> d\u00f6n\u00fc\u015f tipi, fonksiyonun herhangi bir anlaml\u0131 de\u011fer d\u00f6nd\u00fcrmedi\u011fini belirtir. Bu, yan etkileri olan fonksiyonlar i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-typescript\">const logHata = (mesaj: string): void => {\n        console.error(<code>Hata: ${mesaj}<\/code>);\n      };\n    \n      \/\/ Bir i\u015flemi asenkron olarak y\u00fcr\u00fcten ve hatalar\u0131 loglayan fonksiyon\n      async function islemYurut(): Promise<void> {\n        try {\n          await Promise.resolve(\"Ba\u015far\u0131l\u0131 i\u015flem\"); \/\/ Ger\u00e7ek d\u00fcnyada bir API \u00e7a\u011fr\u0131s\u0131 vb. olabilir.\n          console.log(\"\u0130\u015flem tamamland\u0131.\");\n        } catch (error: any) {\n          logHata(error.message);\n        }\n      }\n      islemYurut();<\/pre>\n<p><\/code><br \/>\n    <code>logHata<\/code> fonksiyonu a\u00e7\u0131k\u00e7a bir <code>void<\/code> d\u00f6n\u00fc\u015f tipine sahiptir, bu da bu fonksiyonun bir de\u011fer d\u00f6nd\u00fcrmeyi ama\u00e7lamad\u0131\u011f\u0131n\u0131 netle\u015ftirir. Bu sayede, yanl\u0131\u015fl\u0131kla <code>const sonuc = logHata(\"hata\");<\/code> gibi bir atama yapmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda TypeScript sizi uyar\u0131r.<\/p>\n<p>TypeScript'in tip sistemini arrow fonksiyonlarla birle\u015ftirmek, daha g\u00fcvenli, daha okunabilir ve bak\u0131m\u0131 daha kolay kodlar yazman\u0131z\u0131 sa\u011flar. Tip ek a\u00e7\u0131klamalar\u0131, \u00e7\u0131kar\u0131m\u0131 ve jenerikler sayesinde, geli\u015ftirme s\u00fcrecinde hatalar\u0131 erken yakalar ve kod taban\u0131n\u0131z\u0131n kalitesini art\u0131r\u0131rs\u0131n\u0131z.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Ne Zaman Hangi Parantezi Kullanmal\u0131y\u0131z?<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulayarak peki\u015ftirelim. Arrow fonksiyonlar\u0131, modern JavaScript ve TypeScript uygulamalar\u0131nda say\u0131s\u0131z alanda kullan\u0131l\u0131r. \u00d6zellikle callback fonksiyonlar\u0131, dizi metodlar\u0131 ve asenkron programlamada vazge\u00e7ilmezdirler.<\/p>\n<p>*   <strong>Dizi Metodlar\u0131 (<code>map<\/code>, <code>filter<\/code>, <code>reduce<\/code>) ile Arrow Fonksiyonlar<\/strong><br \/>\n    Bu metodlar, arrow fonksiyonlar\u0131n\u0131n en yayg\u0131n kullan\u0131m alanlar\u0131ndan biridir ve s\u00f6zdizimsel k\u0131sal\u0131klar\u0131n\u0131n en \u00e7ok parlad\u0131\u011f\u0131 yerlerdir.<\/p>\n<pre><code class=\"language-typescript\">interface Urun {\n        id: number;\n        ad: string;\n        fiyat: number;\n        stok: number;\n      }\n    \n      const urunler: Urun[] = [\n        { id: 1, ad: \"Laptop\", fiyat: 1200, stok: 10 },\n        { id: 2, ad: \"Mouse\", fiyat: 25, stok: 50 },\n        { id: 3, ad: \"Klavye\", fiyat: 75, stok: 20 },\n        { id: 4, ad: \"Monit\u00f6r\", fiyat: 300, stok: 5 },\n      ];\n    \n      \/\/ 1. <code>map<\/code>: Her bir \u00fcr\u00fcn\u00fcn sadece ad\u0131n\u0131 i\u00e7eren yeni bir dizi olu\u015fturma\n      \/\/ Tek parametre (urun), tip atamas\u0131 var, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f. Parantez zorunlu.\n      const urunAdlari: string[] = urunler.map((urun: Urun) => urun.ad);\n      console.log(\"\u00dcr\u00fcn Adlar\u0131:\", urunAdlari); \/\/ \u00c7\u0131kt\u0131: \u00dcr\u00fcn Adlar\u0131: [ &#039;Laptop&#039;, &#039;Mouse&#039;, &#039;Klavye&#039;, &#039;Monit\u00f6r&#039; ]\n    \n      \/\/ 2. <code>filter<\/code>: Stokta 10&#039;dan fazla olan \u00fcr\u00fcnleri filtreleme\n      \/\/ Tek parametre (urun), tip atamas\u0131 var, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f. Parantez zorunlu.\n      const yuksekStokluUrunler: Urun[] = urunler.filter((urun: Urun) => urun.stok > 10);\n      console.log(\"Y\u00fcksek Stoklu \u00dcr\u00fcnler:\", yuksekStokluUrunler);\n      \/\/ \u00c7\u0131kt\u0131: Y\u00fcksek Stoklu \u00dcr\u00fcnler: [ { id: 2, ad: &#039;Mouse&#039;, fiyat: 25, stok: 50 }, { id: 3, ad: &#039;Klavye&#039;, fiyat: 75, stok: 20 } ]\n    \n      \/\/ 3. <code>reduce<\/code>: T\u00fcm \u00fcr\u00fcnlerin toplam stok de\u011ferini hesaplama\n      \/\/ \u0130ki parametre (toplamStok, urun), tip atamas\u0131 var, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f. Parantez zorunlu.\n      const toplamStok: number = urunler.reduce((toplam: number, urun: Urun) => toplam + urun.stok, 0);\n      console.log(\"Toplam Stok:\", toplamStok); \/\/ \u00c7\u0131kt\u0131: Toplam Stok: 85<\/pre>\n<p><\/code><br \/>\n    Bu \u00f6rneklerde, <code>map<\/code>, <code>filter<\/code> ve <code>reduce<\/code> gibi yayg\u0131n dizi metodlar\u0131nda arrow fonksiyonlar\u0131n\u0131n ne kadar verimli kullan\u0131labilece\u011fini g\u00f6r\u00fcyoruz. TypeScript tip g\u00fcvenli\u011fi sayesinde, <code>urun<\/code> parametresinin <code>Urun<\/code> interface'ine uygun oldu\u011funu biliyoruz ve <code>urun.ad<\/code>, <code>urun.stok<\/code> gibi \u00f6zelliklere g\u00fcvenle eri\u015febiliriz.<\/p>\n<p>*   <strong>Asenkron Programlama ve Promise Zincirleri<\/strong><br \/>\n    Arrow fonksiyonlar, asenkron i\u015flemlerde <code>Promise<\/code> API'si ile harika bir uyum sa\u011flar, \u00f6zellikle <code>this<\/code> ba\u011flam\u0131 y\u00f6netiminde.<\/p>\n<pre><code class=\"language-typescript\">interface ApiResponse {\n        status: string;\n        data: any[];\n      }\n    \n      function veriCek(url: string): Promise<ApiResponse> {\n        return new Promise((resolve, reject) => {\n          \/\/ fetch API&#039;si taklit ediliyor\n          setTimeout(() => {\n            if (url.includes(\"hata\")) {\n              reject(new Error(\"API hatas\u0131 olu\u015ftu!\"));\n            } else {\n              resolve({ status: \"success\", data: [{ id: 1, name: \"Item A\" }] });\n            }\n          }, 500);\n        });\n      }\n    \n      veriCek(\"https:\/\/api.example.com\/data\")\n        .then((response: ApiResponse) => {\n          \/\/ Tek parametre (response), tip atamas\u0131 var, fonksiyon blo\u011fu var, a\u00e7\u0131k d\u00f6n\u00fc\u015f. Parantez zorunlu.\n          console.log(\"API&#039;den gelen veri:\", response.data);\n          return response.data.length; \/\/ Sonraki then blo\u011funa uzunlu\u011fu g\u00f6nder\n        })\n        .then((dataLength: number) => console.log(\"Veri uzunlu\u011fu:\", dataLength))\n        .catch((error: Error) => {\n          \/\/ Tek parametre (error), tip atamas\u0131 var, fonksiyon blo\u011fu var, d\u00f6n\u00fc\u015f yok (void). Parantez zorunlu.\n          console.error(\"Veri \u00e7ekme hatas\u0131:\", error.message);\n        });\n    \n      veriCek(\"https:\/\/api.example.com\/hata\")\n        .catch((error: Error) => {\n          console.error(\"Hata yakaland\u0131 (hata URL&#039;si):\", error.message);\n        });<\/pre>\n<p><\/code><br \/>\n    <code>Promise<\/code> constructor'\u0131ndaki <code>(resolve, reject) => { ... }<\/code> ve <code>then<\/code>\/<code>catch<\/code> bloklar\u0131ndaki arrow fonksiyonlar\u0131, d\u0131\u015far\u0131daki <code>this<\/code> ba\u011flam\u0131n\u0131 korurken (bu \u00f6rnekte kullan\u0131lmasa da potansiyel olarak \u00f6nemli), kodun daha temiz ve okunabilir kalmas\u0131n\u0131 sa\u011flar. Her bir callback i\u00e7in parametreler ve tipleri net bir \u015fekilde belirtilmi\u015ftir.<\/p>\n<p>*   <strong>Vaka Analizi: Bir Liste Filtreleme Fonksiyonu ve Performans \u0130pu\u00e7lar\u0131<\/strong><br \/>\n    B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken, filtreleme i\u015flemleri performans\u0131 etkileyebilir. Arrow fonksiyonlar, bu senaryolarda hem kod temizli\u011fi hem de potansiyel performans optimizasyonlar\u0131 sunar.<\/p>\n<pre><code class=\"language-typescript\">interface Kayit {\n        id: string;\n        baslik: string;\n        etiketler: string[];\n        olusturulmaTarihi: Date;\n      }\n    \n      const tumKayitlar: Kayit[] = [\n        { id: \"k1\", baslik: \"TypeScript \u0130pu\u00e7lar\u0131\", etiketler: [\"typescript\", \"programlama\"], olusturulmaTarihi: new Date() },\n        { id: \"k2\", baslik: \"React Mimarisi\", etiketler: [\"react\", \"web\"], olusturulmaTarihi: new Date() },\n        { id: \"k3\", baslik: \"Mobil Uyumlu Tasar\u0131m\", etiketler: [\"css\", \"responsive\"], olusturulmaTarihi: new Date() },\n        { id: \"k4\", baslik: \"Performans Optimizasyonu\", etiketler: [\"javascript\", \"performans\"], olusturulmaTarihi: new Date() },\n      ];\n    \n      \/\/ Etiketlere g\u00f6re filtreleme fonksiyonu\n      const kayitlariFiltrele = (kayitlar: Kayit[], arananEtiket: string): Kayit[] => {\n        \/\/ Tek parametre (kayit), tip atamas\u0131 var, tek ifade, \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f. Parantez zorunlu.\n        return kayitlar.filter((kayit: Kayit) => kayit.etiketler.includes(arananEtiket));\n      };\n    \n      const typescriptKayitlari = kayitlariFiltrele(tumKayitlar, \"typescript\");\n      console.log(\"TypeScript Kay\u0131tlar\u0131:\", typescriptKayitlari);\n      \/\/ \u00c7\u0131kt\u0131: TypeScript Kay\u0131tlar\u0131: [ { id: &#039;k1&#039;, baslik: &#039;TypeScript \u0130pu\u00e7lar\u0131&#039;, etiketler: [ &#039;typescript&#039;, &#039;programlama&#039; ], olusturulmaTarihi: ... } ]<\/pre>\n<p><\/code><br \/>\n    Bu filtreleme fonksiyonu son derece okunabilir ve etkilidir. <code>filter<\/code> metodunun i\u00e7ine do\u011frudan bir arrow fonksiyonu ge\u00e7irmek, her <code>kayit<\/code> objesini tek tek kontrol etmemizi sa\u011flar.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: Fonksiyonel programlaman\u0131n bir par\u00e7as\u0131 olarak, saf (pure) fonksiyonlar yazmaya \u00f6zen g\u00f6sterin. Saf fonksiyonlar, ayn\u0131 girdiye her zaman ayn\u0131 \u00e7\u0131kt\u0131y\u0131 verir ve d\u0131\u015f d\u00fcnyaya yan etkisi olmaz. Bu, test edilebilirli\u011fi ve kodun tahmin edilebilirli\u011fini art\u0131r\u0131r.<\/p>\n<p>Bu ger\u00e7ek d\u00fcnya senaryolar\u0131, arrow fonksiyonlar\u0131n\u0131n modern geli\u015ftirmenin temel ta\u015flar\u0131ndan biri oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Do\u011fru parantez kullan\u0131m\u0131 ve TypeScript ile entegrasyonu sayesinde, hem daha k\u0131sa hem de daha g\u00fcvenli kodlar yazarak projelerinizin kalitesini art\u0131rabilirsiniz.<\/p>\n<h3>Yayg\u0131n Hatalar ve Ka\u00e7\u0131n\u0131lmas\u0131 Gereken Durumlar<\/h3>\n<p>Arrow fonksiyonlar\u0131 g\u00fc\u00e7l\u00fc ve kullan\u0131\u015fl\u0131 olsa da, do\u011fru kullan\u0131lmad\u0131\u011f\u0131nda baz\u0131 yayg\u0131n hatalara yol a\u00e7abilirler. Bu hatalar\u0131 bilmek, bunlardan ka\u00e7\u0131nman\u0131za ve daha sa\u011flam kodlar yazman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>*   <strong>1. Nesne Literalini \u00d6rt\u00fcl\u00fc D\u00f6nd\u00fcr\u00fcrken Parantezleri Unutmak<\/strong><br \/>\n    Bu, daha \u00f6nce de bahsetti\u011fimiz gibi en s\u0131k yap\u0131lan hatalardan biridir. JavaScript, s\u00fcsl\u00fc parantezleri <code>{}<\/code> otomatik olarak bir kod blo\u011fu olarak yorumlar, bir nesne literaali olarak de\u011fil.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Hatal\u0131: &#039;{ property: value }&#039; bir fonksiyon g\u00f6vdesi olarak yorumlan\u0131r, d\u00f6n\u00fc\u015f de\u011feri yok.\n      \/\/ const olusturKullaniciHata = (ad: string, yas: number) => { ad: ad, yas: yas };\n      \/\/ console.log(olusturKullaniciHata(\"Can\", 30)); \/\/ TypeError: Cannot read property &#039;ad&#039; of undefined veya undefined\n    \n      \/\/ Do\u011fru: Nesne literalini parantez i\u00e7ine alarak \u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\u00fc etkinle\u015ftirme\n      interface Kisi { ad: string; yas: number; }\n      const olusturKullaniciDogru = (ad: string, yas: number): Kisi => ({ ad: ad, yas: yas });\n      console.log(olusturKullaniciDogru(\"Can\", 30)); \/\/ \u00c7\u0131kt\u0131: { ad: &#039;Can&#039;, yas: 30 }<\/pre>\n<p><\/code><br \/>\n    <strong>\u00c7\u00f6z\u00fcm<\/strong>: Nesne literalini d\u00f6nd\u00fcrmek i\u00e7in <code>({...})<\/code> \u015feklinde ek parantezler kullan\u0131n.<\/p>\n<p>*   <strong>2. Tek Parametreye Tip Atarken Parantezleri Atlamak<\/strong><br \/>\n    Tek parametreli bir arrow fonksiyonunda parametreye tip atamas\u0131 yap\u0131ld\u0131\u011f\u0131nda, parametre listesi i\u00e7in parantezlerin kullan\u0131lmas\u0131 zorunludur.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Hatal\u0131: Tek parametreye tip atan\u0131rken parantez atlanm\u0131\u015f\n      \/\/ const carpHata = sayi: number => sayi * 2; \/\/ Syntax Error\n    \n      \/\/ Do\u011fru: Tek parametreye tip atan\u0131rken parantezler kullan\u0131lmal\u0131\n      const carpDogru = (sayi: number): number => sayi * 2;\n      console.log(carpDogru(10)); \/\/ \u00c7\u0131kt\u0131: 20<\/pre>\n<p><\/code><br \/>\n    <strong>\u00c7\u00f6z\u00fcm<\/strong>: Tek parametreye tip atarken <code>(parametre: Tip)<\/code> yap\u0131s\u0131n\u0131 kullan\u0131n.<\/p>\n<p>*   <strong>3. Yanl\u0131\u015f <code>this<\/code> Ba\u011flam\u0131 Beklentisi (Eskiden Kalan Al\u0131\u015fkanl\u0131klar)<\/strong><br \/>\n    Arrow fonksiyonlar\u0131 <code>this<\/code> ba\u011flam\u0131n\u0131 lexical olarak miras alsa da, bazen geli\u015ftiriciler al\u0131\u015fkanl\u0131ktan dolay\u0131 geleneksel fonksiyonlardaki <code>this<\/code> davran\u0131\u015f\u0131n\u0131 bekleyebilirler. \u00d6zellikle <code>arguments<\/code> objesi ile kar\u0131\u015ft\u0131r\u0131labilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Geleneksel fonksiyonlarda &#039;arguments&#039; kullan\u0131labilir\n      function eskiFonksiyon() {\n        console.log(arguments); \/\/ [1, 2, 3]\n      }\n      eskiFonksiyon(1, 2, 3);\n    \n      \/\/ Arrow fonksiyonlar\u0131nda &#039;arguments&#039; objesi bulunmaz\n      const arrowFonksiyonu = (...args: number[]) => {\n        \/\/ console.log(arguments); \/\/ Hata: arguments is not defined\n        console.log(args); \/\/ [4, 5, 6]\n      };\n      arrowFonksiyonu(4, 5, 6);<\/pre>\n<p><\/code><br \/>\n    <strong>\u00c7\u00f6z\u00fcm<\/strong>: Arrow fonksiyonlarda <code>arguments<\/code> objesi yerine rest parametrelerini (<code>...args<\/code>) kullan\u0131n.<\/p>\n<p>*   <strong>4. A\u015f\u0131r\u0131 K\u0131saltma ve Kodun Okunabilirli\u011fini Feda Etmek<\/strong><br \/>\n    Arrow fonksiyonlar\u0131n\u0131n k\u0131sal\u0131\u011f\u0131 cazip olsa da, \u00e7ok karma\u015f\u0131k veya uzun tek sat\u0131rl\u0131k fonksiyonlar yazmak kodun okunabilirli\u011fini d\u00fc\u015f\u00fcrebilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Okunmas\u0131 zor olabilir\n      const karma\u015f\u0131kIslem = (x: number, y: number) => x > 0 && y < 10 ? x * y : (x + y) \/ 2;\n    \n      \/\/ Daha okunabilir versiyon\n      const karma\u015f\u0131kIslemOkunabilir = (x: number, y: number): number => {\n        if (x > 0 && y < 10) {\n          return x * y;\n        } else {\n          return (x + y) \/ 2;\n        }\n      };<\/pre>\n<p><\/code><br \/>\n    <strong>\u00c7\u00f6z\u00fcm<\/strong>: Mant\u0131k karma\u015f\u0131kla\u015ft\u0131\u011f\u0131nda, s\u00fcsl\u00fc parantezleri ve a\u00e7\u0131k <code>return<\/code> ifadesini kullanarak kodu daha par\u00e7al\u0131 ve anla\u015f\u0131l\u0131r hale getirin. Okunabilirlik, genellikle k\u0131sal\u0131ktan daha \u00f6nemlidir.<\/p>\n<p>*   <strong>5. Linter Kurallar\u0131na Uymamak<\/strong><br \/>\n    ESLint, Prettier gibi ara\u00e7lar, kod stilini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in arrow fonksiyonlar\u0131 i\u00e7in belirli kurallar tan\u0131mlayabilir. \u00d6rne\u011fin, \"always use parentheses for single parameter\" (tek parametrede her zaman parantez kullan) kural\u0131 olabilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Lint kural\u0131na g\u00f6re hatal\u0131 olabilir (e.g. &#039;arrow-parens&#039;: [&#039;error&#039;, &#039;always&#039;])\n      \/\/ const selam = isim => <code>Merhaba, ${isim}<\/code>;\n    \n      \/\/ Lint kural\u0131na g\u00f6re do\u011fru (her zaman parantez kullan\u0131r)\n      const selam = (isim: string): string => <code>Merhaba, ${isim}<\/code>;\n      console.log(selam(\"D\u00fcnya\"));<\/pre>\n<p><\/code><br \/>\n    <strong>\u00c7\u00f6z\u00fcm<\/strong>: Projenizin linter ve bi\u00e7imlendirici kurallar\u0131n\u0131 takip edin. Bu, tak\u0131m i\u00e7inde kod tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar ve potansiyel hatalar\u0131 \u00f6nler.<\/p>\n<p>Bu yayg\u0131n hatalardan ka\u00e7\u0131nmak, arrow fonksiyonlar\u0131n\u0131 daha etkili ve g\u00fcvenli bir \u015fekilde kullanman\u0131za yard\u0131mc\u0131 olacakt\u0131r. TypeScript'in tip sistemi, bu hatalar\u0131n bir\u00e7o\u011funu derleme zaman\u0131nda yakalayarak size b\u00fcy\u00fck bir avantaj sa\u011flar.<\/p>\n<h3>Mobil Uyumlu HTML ve TypeScript Geli\u015ftirmeleri: Bir Bak\u0131\u015f<\/h3>\n<p>Bu makale genellikle TypeScript'teki arrow fonksiyonlar\u0131n\u0131n s\u00f6zdizimsel ve anlamsal y\u00f6nlerine odaklanm\u0131\u015f olsa da, modern web geli\u015ftirme ba\u011flam\u0131nda mobil uyumlulu\u011fun ve responsive tasar\u0131m\u0131n da \u00f6nemini g\u00f6z ard\u0131 edemeyiz. TypeScript, direkt olarak HTML'in g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc etkilemese de, mobil uyumlu kullan\u0131c\u0131 aray\u00fczlerinin arkas\u0131ndaki dinamik ve etkile\u015fimli mant\u0131\u011f\u0131 in\u015fa etmek i\u00e7in kritik bir rol oynar. Arrow fonksiyonlar ise bu mant\u0131\u011f\u0131 daha temiz ve y\u00f6netilebilir hale getirir.<\/p>\n<p>Bir React veya Angular bile\u015feninde, ekran boyutuna veya cihaz\u0131n y\u00f6n\u00fcne g\u00f6re UI'yi dinamik olarak de\u011fi\u015ftiren JavaScript (veya TypeScript) kodu yazarken arrow fonksiyonlar\u0131n\u0131 yo\u011fun bir \u015fekilde kullan\u0131r\u0131z. \u00d6rne\u011fin, bir <code>resize<\/code> olay dinleyicisi tan\u0131mlarken:<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bu kod \u00f6rne\u011fi bir web bile\u015feninde (\u00f6rne\u011fin React&#039;ta) kullan\u0131l\u0131yor olabilir.\nclass ResponsiveComponent {\n  screenWidth: number = window.innerWidth;\n\n  constructor() {\n    \/\/ Arrow fonksiyonu kullanarak this ba\u011flam\u0131n\u0131 koruma\n    window.addEventListener(&#039;resize&#039;, this.handleResize);\n  }\n\n  handleResize = () => { \/\/ Arrow fonksiyon metodu\n    this.screenWidth = window.innerWidth;\n    console.log(<code>Ekran geni\u015fli\u011fi de\u011fi\u015fti: ${this.screenWidth}px<\/code>);\n    \/\/ Burada ekran geni\u015fli\u011fine g\u00f6re UI&#039;yi g\u00fcncelleyen bir setState() \u00e7a\u011fr\u0131s\u0131 olabilir.\n  };\n\n  destroy() {\n    window.removeEventListener(&#039;resize&#039;, this.handleResize);\n  }\n}\n\nconst component = new ResponsiveComponent();\n\/\/ component.destroy(); \/\/ Bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda dinleyiciyi kald\u0131rmak i\u00e7in<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>handleResize<\/code> metodu bir arrow fonksiyonu olarak tan\u0131mland\u0131\u011f\u0131 i\u00e7in, <code>window.addEventListener<\/code> i\u00e7indeki <code>this<\/code> ba\u011flam\u0131 otomatik olarak <code>ResponsiveComponent<\/code> \u00f6rne\u011fine sabitlenir. Bu sayede <code>this.screenWidth<\/code> do\u011fru \u015fekilde g\u00fcncellenebilir. Bu t\u00fcr bir dinamizm, kullan\u0131c\u0131n\u0131n cihaz\u0131na g\u00f6re uyarlanan bir kullan\u0131c\u0131 deneyimi sunmak i\u00e7in \u00f6nemlidir.<\/p>\n<p><strong>Peki, mobil uyumlu HTML'e nas\u0131l yans\u0131r?<\/strong> HTML yap\u0131s\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmek veya CSS s\u0131n\u0131flar\u0131 eklemek i\u00e7in TypeScript kullan\u0131l\u0131rken, CSS'in kendisi medya sorgular\u0131yla (media queries) mobil uyumlulu\u011fu sa\u011flar. \u0130\u015fte basit bir CSS medya sorgusu \u00f6rne\u011fi (normalde bir <code><\/p>\n<style><\/code> blo\u011funda veya harici bir CSS dosyas\u0131nda yer al\u0131r):<\/p>\n<pre><code class=\"language-html\"><style>\n  .container {\n    width: 90%;\n    margin: 0 auto;\n    padding: 10px;\n    background-color: lightblue;\n  }\n\n  .item {\n    width: 100%; \/* Mobil cihazlarda tek s\u00fctun *\/\n    margin-bottom: 10px;\n    background-color: lightcoral;\n    padding: 10px;\n  }\n\n  @media (min-width: 768px) { \/* Tablet ve \u00fczeri ekranlar *\/\n    .container {\n      width: 70%;\n    }\n    .item {\n      width: calc(50% - 20px); \/* \u0130ki s\u00fctun, aralar\u0131nda bo\u015fluk *\/\n      display: inline-block;\n      margin-right: 20px;\n    }\n    .item:nth-child(2n) {\n      margin-right: 0;\n    }\n  }\n\n  @media (min-width: 1024px) { \/* Masa\u00fcst\u00fc ekranlar *\/\n    .container {\n      width: 60%;\n    }\n    .item {\n      width: calc(33.33% - 20px); \/* \u00dc\u00e7 s\u00fctun *\/\n    }\n    .item:nth-child(3n) {\n      margin-right: 0;\n    }\n  }\n<\/style>\n\n<div class=\"container\">\n  <div class=\"item\">Mobil \u00d6\u011fe 1<\/div>\n  <div class=\"item\">Mobil \u00d6\u011fe 2<\/div>\n  <div class=\"item\">Mobil \u00d6\u011fe 3<\/div>\n<\/div><\/pre>\n<p><\/code><\/p>\n<p>TypeScript, yukar\u0131daki HTML\/CSS yap\u0131s\u0131n\u0131 do\u011frudan olu\u015fturmaz veya de\u011fi\u015ftirmez, ancak bu yap\u0131ya dinamiklik katar. \u00d6rne\u011fin, bir TypeScript fonksiyonu, <code>window.innerWidth<\/code> de\u011ferine g\u00f6re <code>.container<\/code> eleman\u0131na farkl\u0131 bir s\u0131n\u0131f (<code>.desktop-layout<\/code>, <code>.tablet-layout<\/code> gibi) ekleyerek CSS'in medya sorgular\u0131n\u0131 tetikleyebilir. Arrow fonksiyonlar, bu olay dinleyicilerini veya dinamik s\u0131n\u0131f ekleme mant\u0131\u011f\u0131n\u0131 daha temiz bir \u015fekilde yazmam\u0131za yard\u0131mc\u0131 olur. Dolay\u0131s\u0131yla, arrow fonksiyonlar\u0131 modern, duyarl\u0131 ve mobil uyumlu web uygulamalar\u0131n\u0131n arkas\u0131ndaki mant\u0131\u011f\u0131 in\u015fa etmede kritik bir kolayla\u015ft\u0131r\u0131c\u0131 ara\u00e7t\u0131r.<\/p>\n<h3>Sonu\u00e7: Kodunuzu Daha Temiz ve G\u00fcvenli Hale Getirin<\/h3>\n<p>Arrow fonksiyonlar, modern JavaScript ve TypeScript geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Geleneksel fonksiyonlara k\u0131yasla sunduklar\u0131 s\u00f6zdizimsel k\u0131sal\u0131k ve \u00f6zellikle <code>this<\/code> ba\u011flam\u0131n\u0131 lexical olarak ele alma yetenekleri sayesinde, kod yaz\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirmi\u015f ve \u00f6zellikle callback tabanl\u0131 programlamada veya s\u0131n\u0131f bile\u015fenlerinde <code>this<\/code> karma\u015fas\u0131n\u0131 ortadan kald\u0131rm\u0131\u015ft\u0131r.<\/p>\n<p>Bu makalede, arrow fonksiyonlar\u0131n\u0131n parametre listesinde ve fonksiyon g\u00f6vdesinde parantezlerin (<code>()<\/code> ve <code>{}<\/code>) ne zaman zorunlu oldu\u011funu, ne zaman atlanabilece\u011fini detayl\u0131 bir \u015fekilde inceledik. Anahtar \u00e7\u0131kar\u0131mlar \u015funlard\u0131r:<\/p>\n<p>*   <strong>Parametre Parantezleri (<code>()<\/code>):<\/strong><br \/>\n    *   S\u0131f\u0131r parametrede <code>()<\/code> her zaman zorunludur.<br \/>\n    *   Birden fazla parametrede <code>()<\/code> her zaman zorunludur.<br \/>\n    *   Tek parametreye tip atamas\u0131 yap\u0131ld\u0131\u011f\u0131nda <code>()<\/code> her zaman zorunludur.<br \/>\n    *   Destructuring veya rest parametreleri kullan\u0131ld\u0131\u011f\u0131nda <code>()<\/code> her zaman zorunludur.<br \/>\n    *   Yaln\u0131zca tek bir parametreye sahip ve tip atamas\u0131 yap\u0131lmam\u0131\u015f arrow fonksiyonlar\u0131nda parantezler atlanabilir (\u00f6rne\u011fin <code>param => ...<\/code>). Ancak, TypeScript ile \u00e7o\u011fu zaman tip atamas\u0131 yapaca\u011f\u0131n\u0131z i\u00e7in, parantez kullanmak genel bir kural haline gelir.<\/p>\n<p>*   <strong>G\u00f6vde Parantezleri (<code>{}<\/code>):<\/strong><br \/>\n    *   Fonksiyon g\u00f6vdesi tek bir ifade i\u00e7eriyorsa ve bu ifadenin sonucunu d\u00f6nd\u00fcrmek istiyorsan\u0131z (\"\u00f6rt\u00fcl\u00fc d\u00f6n\u00fc\u015f\"), s\u00fcsl\u00fc parantezleri ve <code>return<\/code> anahtar kelimesini atlayabilirsiniz (\u00f6rne\u011fin <code>param => param * 2<\/code>).<br \/>\n    *   Fonksiyon g\u00f6vdesi birden fazla ifade i\u00e7eriyorsa, yan etkileri varsa (<code>console.log<\/code> gibi) veya bir blok yap\u0131s\u0131 gerekiyorsa (\"a\u00e7\u0131k d\u00f6n\u00fc\u015f\"), s\u00fcsl\u00fc parantezler ve <code>return<\/code> anahtar kelimesi zorunludur.<br \/>\n    *   Bir nesne literalini \u00f6rt\u00fcl\u00fc olarak d\u00f6nd\u00fcrmek i\u00e7in, nesne literalini \u00e7evreleyen ek parantezler <code>()<\/code> kullanman\u0131z gerekti\u011fini unutmay\u0131n (\u00f6rne\u011fin <code>param => ({ key: param })<\/code>).<\/p>\n<p>TypeScript, bu kurallara ek olarak tip g\u00fcvenli\u011fi, tip \u00e7\u0131kar\u0131m\u0131 ve jenerikler gibi g\u00fc\u00e7l\u00fc \u00f6zellikleriyle arrow fonksiyonlar\u0131n\u0131n kullan\u0131m\u0131n\u0131 daha da geli\u015ftirir. Hatalar\u0131 derleme zaman\u0131nda yakalayarak geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve daha g\u00fcvenilir uygulamalar olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<p>Arrow fonksiyonlar\u0131n\u0131 do\u011fru bir \u015fekilde anlamak ve kullanmak, hem daha temiz ve okunabilir kodlar yazman\u0131z\u0131 sa\u011flar hem de modern JavaScript ve TypeScript ekosisteminin sundu\u011fu t\u00fcm avantajlardan faydalanman\u0131z\u0131 garantiler. Kod tutarl\u0131l\u0131\u011f\u0131 ve okunabilirli\u011fi i\u00e7in linter kurallar\u0131na uymak, tak\u0131m projelerinde ortak bir standart belirlemek a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir.<\/p>\n<p class=\"tip\">Uzman \u0130pucu: TypeScript'in strict modunu her zaman etkinle\u015ftirin. Bu, null\/undefined denetimlerinden gereksiz 'any' kullan\u0131m\u0131na kadar bir\u00e7ok potansiyel hatay\u0131 erken a\u015famada yakalaman\u0131z\u0131 sa\u011flar ve kod kalitenizi art\u0131r\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (FAQs)<\/h3>\n<p><strong>1. Arrow fonksiyonlar\u0131nda tek parametre varken parantezleri neden atabiliriz?<\/strong><br \/>\n    Tek parametreli bir arrow fonksiyonunda, e\u011fer parametreye herhangi bir tip atamas\u0131 yap\u0131lm\u0131yorsa, <code>(param)<\/code> yerine <code>param<\/code> \u015feklinde parantezleri atlayabilirsiniz. Bu, s\u00f6zdizimini daha da k\u0131saltmak i\u00e7in tasarlanm\u0131\u015f bir \u00f6zelliktir. Ancak TypeScript ile genellikle tip atamas\u0131 yap\u0131ld\u0131\u011f\u0131 i\u00e7in, \u00e7o\u011fu zaman parantez kullanman\u0131z gerekecektir.<\/p>\n<p><strong>2. <code>param => { key: value }<\/code> neden hata verir?<\/strong><br \/>\n    JavaScript, <code>param => { ... }<\/code> yap\u0131s\u0131ndaki s\u00fcsl\u00fc parantezleri bir fonksiyon g\u00f6vdesi blo\u011fu olarak yorumlar, bir nesne literaali olarak de\u011fil. E\u011fer bir nesne literalini \u00f6rt\u00fcl\u00fc olarak d\u00f6nd\u00fcrmek istiyorsan\u0131z, nesne literalini ek parantezlerle <code>param => ({ key: value })<\/code> \u015feklinde \u00e7evrelemelisiniz.<\/p>\n<p><strong>3. Arrow fonksiyonlar <code>arguments<\/code> objesine eri\u015febilir mi?<\/strong><br \/>\n    Hay\u0131r, arrow fonksiyonlar kendi <code>arguments<\/code> objelerini olu\u015fturmazlar. Tan\u0131mland\u0131klar\u0131 d\u0131\u015f kapsamdaki <code>arguments<\/code> objesine eri\u015febilirler (bu genellikle istenmez veya kar\u0131\u015ft\u0131r\u0131l\u0131r), ancak kendi <code>arguments<\/code> listeleri yoktur. E\u011fer bir fonksiyonda de\u011fi\u015fken say\u0131da arg\u00fcman yakalaman\u0131z gerekiyorsa, bunun yerine rest parametrelerini (<code>...args: Type[]<\/code>) kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong>4. Ne zaman normal fonksiyon yerine arrow fonksiyon kullanmal\u0131y\u0131m?<\/strong><br \/>\n    Arrow fonksiyonlar genellikle <code>this<\/code> ba\u011flam\u0131n\u0131n lexical olarak korunmas\u0131n\u0131n \u00f6nemli oldu\u011fu durumlarda (callback'ler, s\u0131n\u0131f metodlar\u0131, olay i\u015fleyicileri) ve k\u0131sa, tek ifadeli fonksiyonlar i\u00e7in (dizi metodlar\u0131 gibi) tercih edilir. Geleneksel fonksiyonlar ise kendi <code>this<\/code> ba\u011flamlar\u0131n\u0131 gerektiren durumlarda (constructor'lar, objeye ba\u011fl\u0131 metodlar, <code>arguments<\/code> objesine ihtiya\u00e7 duyuldu\u011funda) veya daha karma\u015f\u0131k fonksiyonel tan\u0131mlamalar i\u00e7in hala ge\u00e7erlidir.<\/p>\n<p><strong>5. TypeScript'te arrow fonksiyonlar\u0131 kullanman\u0131n en b\u00fcy\u00fck faydas\u0131 nedir?<\/strong><br \/>\n    TypeScript'te arrow fonksiyonlar\u0131 kullanman\u0131n en b\u00fcy\u00fck faydas\u0131, hem JavaScript'in sundu\u011fu <code>this<\/code> ba\u011flam\u0131 kolayl\u0131\u011f\u0131n\u0131 ve s\u00f6zdizimsel k\u0131sal\u0131\u011f\u0131 elde etmeniz hem de TypeScript'in statik tip denetimi sayesinde parametre ve d\u00f6n\u00fc\u015f tiplerini a\u00e7\u0131k\u00e7a belirterek veya tip \u00e7\u0131kar\u0131m\u0131ndan yararlanarak kodunuzu daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay hale getirmenizdir. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda hata ay\u0131klama s\u00fcresini azalt\u0131r ve geli\u015ftirici verimlili\u011fini art\u0131r\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript ve TypeScript d\u00fcnyas\u0131nda arrow fonksiyonlar (ok fonksiyonlar\u0131), kod yaz\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftiren ve modern geli\u015ftirmede vazge\u00e7ilmez bir&hellip;","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-34101","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>Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f<\/title>\n<meta name=\"description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\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\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-11T03:31:26+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=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f\",\"datePublished\":\"2025-11-11T03:31:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\"},\"wordCount\":4943,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\",\"name\":\"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-11T03:31:26+00:00\",\"description\":\"Hi\u00e7bir etiketi bulunamad\u0131.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f\"}]},{\"@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":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f","description":"Hi\u00e7bir etiketi bulunamad\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\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/","og_locale":"tr_TR","og_type":"article","og_title":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f","og_description":"Hi\u00e7bir etiketi bulunamad\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-11T03:31:26+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f","datePublished":"2025-11-11T03:31:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/"},"wordCount":4943,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/","url":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/","name":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-11T03:31:26+00:00","description":"Hi\u00e7bir etiketi bulunamad\u0131.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/arrow-fonksiyonlarinda-parantezler-neden-onemli-typescript-derin-dalis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Arrow Fonksiyonlar\u0131nda Parantezler Neden \u00d6nemli? TypeScript Derin Dal\u0131\u015f"}]},{"@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\/34101","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=34101"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34101\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}