{"id":35403,"date":"2025-11-29T08:31:10","date_gmt":"2025-11-29T05:31:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/"},"modified":"2025-11-29T08:31:10","modified_gmt":"2025-11-29T05:31:10","slug":"typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/","title":{"rendered":"TypeScript&#8217;te &#8216;?&#8217; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n"},"content":{"rendered":"<p><body><\/p>\n<p>TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z &#8216;?&#8217; i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, &#8216;?&#8217; kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript&#8217;in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan <code>Omit<\/code> ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.<\/p>\n<p>TypeScript&#8217;e yeni ba\u015flayanlar veya h\u0131zl\u0131 prototipleme yapanlar i\u00e7in &#8216;?&#8217; operat\u00f6r\u00fc cazip bir kolayl\u0131k sunar. Bir \u00f6zelli\u011fin iste\u011fe ba\u011fl\u0131 oldu\u011funu belirtmek, \u00f6zellikle dinamik veri yap\u0131lar\u0131yla veya hen\u00fcz tam olarak olgunla\u015fmam\u0131\u015f API&#8217;lerle \u00e7al\u0131\u015f\u0131rken olduk\u00e7a pratik g\u00f6r\u00fcn\u00fcr. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n telefon numaras\u0131n\u0131n her zaman mevcut olmayabilece\u011fini d\u00fc\u015f\u00fcnelim. Bu durumda, <code>telefonNumarasi?: string;<\/code> \u015feklinde bir tan\u0131m yapmak ilk bak\u0131\u015fta mant\u0131kl\u0131d\u0131r.<\/p>\n<pre><code>\ninterface Kullanici {\n  id: string;\n  ad: string;\n  soyad: string;\n  email: string;\n  telefonNumarasi?: string; \/\/ Opsiyonel alan\n}\n\nconst kullanici1: Kullanici = {\n  id: \"1\",\n  ad: \"Can\",\n  soyad: \"Y\u0131lmaz\",\n  email: \"can@example.com\",\n};\n\nconst kullanici2: Kullanici = {\n  id: \"2\",\n  ad: \"Ay\u015fe\",\n  soyad: \"Demir\",\n  email: \"ayse@example.com\",\n  telefonNumarasi: \"5551234567\",\n};\n\n<\/pre>\n<p><\/code><\/p>\n<p>Ancak, bu kolayl\u0131\u011f\u0131n ard\u0131nda yatan gizli riskler, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda zamanla ortaya \u00e7\u0131kabilir. Opsiyonel olarak i\u015faretledi\u011fimiz bir alan, kodun farkl\u0131 yerlerinde kullan\u0131ld\u0131\u011f\u0131nda <code>undefined<\/code> de\u011ferine sahip olabilir. TypeScript, derleme zaman\u0131nda bu potansiyel <code>undefined<\/code> durumunu bize hat\u0131rlatsa da, geli\u015ftiriciler genellikle bu uyar\u0131lar\u0131 <code>?.<\/code> (opsiyonel zincirleme) veya <code>!<\/code> (kesin atama onay\u0131) gibi operat\u00f6rlerle ge\u00e7i\u015ftirmeyi tercih ederler. Bu durum, runtime hatalar\u0131na zemin haz\u0131rlayabilir.<\/p>\n<p>Diyelim ki bir fonksiyon, <code>Kullanici<\/code> tipindeki bir objenin <code>telefonNumarasi<\/code> \u00f6zelli\u011fini kullanarak bir SMS g\u00f6nderme i\u015flemi yapacak:<\/p>\n<pre><code>\nfunction smsGonder(kullanici: Kullanici, mesaj: string) {\n  if (kullanici.telefonNumarasi) {\n    console.log(<code>${kullanici.telefonNumarasi} numaras\u0131na SMS g\u00f6nderildi: ${mesaj}<\/code>);\n  } else {\n    console.warn(<code>${kullanici.ad} kullan\u0131c\u0131s\u0131n\u0131n telefon numaras\u0131 yok, SMS g\u00f6nderilemedi.<\/code>);\n  }\n}\n\nsmsGonder(kullanici1, \"Merhaba!\"); \/\/ Uyar\u0131 verir\nsmsGonder(kullanici2, \"Toplant\u0131 hat\u0131rlatmas\u0131.\"); \/\/ SMS g\u00f6nderir\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte <code>if<\/code> kontrol\u00fc ile durumu ele almam\u0131z, kodu daha g\u00fcvenli hale getirir. Ancak ya her yerde bu kontrol\u00fc yapmay\u0131 unutursak? Veya, bir alan asl\u0131nda her zaman mevcut olmas\u0131 gereken bir ba\u011flamda opsiyonel olarak i\u015faretlenmi\u015fse ne olur? \u00d6rne\u011fin, bir sipari\u015f objesinde <code>siparisKodu?: string;<\/code> \u015feklinde bir tan\u0131m, sipari\u015f olu\u015ftuktan sonra her sipari\u015fin bir kodunun olmas\u0131 gerekti\u011fi mant\u0131\u011f\u0131na ayk\u0131r\u0131 olabilir. Bu t\u00fcr durumlar, geli\u015ftirici niyetini belirsizle\u015ftirir ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131r\u0131r.<\/p>\n<p>Ayr\u0131ca, <code>undefined<\/code> ile \u00e7al\u0131\u015fmak, JavaScript'in gev\u015fek tip yap\u0131s\u0131ndan kaynaklanan tip d\u00f6n\u00fc\u015f\u00fcm\u00fc sorunlar\u0131na da yol a\u00e7abilir. \u00d6rne\u011fin, bir say\u0131 beklenen yerde <code>undefined<\/code> gelirse, matematiksel i\u015flemler NaN (Not a Number) sonucunu verebilir veya beklenmedik davran\u0131\u015flar sergilenebilir. Bu t\u00fcr belirsizlikler, \u00f6zellikle b\u00fcy\u00fck ekiplerle \u00e7al\u0131\u015f\u0131rken veya uzun soluklu projelerde, teknik borcu art\u0131rarak projenin s\u00fcrd\u00fcr\u00fclebilirli\u011fini olumsuz etkiler. Bu nedenle, TypeScript'in sundu\u011fu tip sistemini maksimum d\u00fczeyde kullanarak, '?' yerine daha kesin ve niyetimizi a\u00e7\u0131k\u00e7a belirten yakla\u015f\u0131mlar benimsememiz b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<blockquote class=\"interactive-element\">\n<p>Uzman \u0130pucu: Her '?' kullan\u0131m\u0131nda kendinize \"Bu alan ger\u00e7ekten her zaman opsiyonel mi, yoksa belirli bir ba\u011flamda m\u0131 opsiyonel olmal\u0131?\" diye sorun. Cevap ikincisiyse, muhtemelen yeni bir tip t\u00fcretme zaman\u0131 gelmi\u015ftir.<\/p>\n<\/blockquote>\n<h2 id=\"utility-tipleri-tanisma\">G\u00fcvenli Tip Y\u00f6netimi \u0130\u00e7in Utility Tiplerini Tan\u0131yor Musunuz?<\/h2>\n<p>TypeScript, sadece statik tip denetimi sa\u011flamakla kalmaz, ayn\u0131 zamanda mevcut tiplerden yeni tipler t\u00fcretme konusunda da inan\u0131lmaz bir esneklik sunar. \u0130\u015fte bu noktada \"Utility Tipler\" devreye girer. Utility tipleri, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, mevcut tipleri belirli bir ihtiyaca g\u00f6re d\u00f6n\u00fc\u015ft\u00fcrmemize, de\u011fi\u015ftirmemize veya onlardan yeni tipler t\u00fcretmemize yarayan kullan\u0131\u015fl\u0131 ara\u00e7lard\u0131r. Bunlar, TypeScript'in g\u00fcc\u00fcn\u00fc tam anlam\u0131yla kullanmam\u0131z\u0131 sa\u011flayan y\u00fcksek seviyeli meta-programlama yetenekleri olarak d\u00fc\u015f\u00fcn\u00fclebilir.<\/p>\n<p>Peki neden bu kadar \u00f6nemliler? Temel bir tip tan\u0131mlad\u0131ktan sonra, bu tipi farkl\u0131 senaryolarda k\u00fc\u00e7\u00fck de\u011fi\u015fikliklerle kullanma ihtiyac\u0131 s\u0131k\u00e7a do\u011far. \u00d6rne\u011fin, bir veritaban\u0131 kayd\u0131 i\u00e7in tam bir tipiniz varken, bu kayd\u0131n sadece belirli alanlar\u0131n\u0131 i\u00e7eren bir \"g\u00f6r\u00fcnt\u00fcleme\" tipi veya yeni bir kay\u0131t olu\u015ftururken ID alan\u0131 olmayan bir \"olu\u015fturma\" tipi isteyebilirsiniz. Bu t\u00fcr durumlar\u0131 her seferinde ba\u015ftan manuel olarak tan\u0131mlamak, hem zaman al\u0131c\u0131d\u0131r hem de hata yapma potansiyelini art\u0131r\u0131r. \u0130\u015fte Utility tipleri bu tekrarl\u0131l\u0131\u011f\u0131 ortadan kald\u0131r\u0131r ve kod taban\u0131n\u0131z\u0131n daha DRY (Don't Repeat Yourself - Kendini Tekrarlama) olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>TypeScript'in sa\u011flad\u0131\u011f\u0131 baz\u0131 yayg\u0131n Utility Tipleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>Partial<T><\/code>: Bir tipin t\u00fcm \u00f6zelliklerini iste\u011fe ba\u011fl\u0131 (opsiyonel) yapar. Genellikle bir nesnenin sadece belirli alanlar\u0131n\u0131 g\u00fcncellerken kullan\u0131l\u0131r.<\/li>\n<li><code>Required<T><\/code>: Bir tipin t\u00fcm \u00f6zelliklerini zorunlu (required) yapar. <code>Partial<\/code>'\u0131n tam tersidir.<\/li>\n<li><code>Readonly<T><\/code>: Bir tipin t\u00fcm \u00f6zelliklerini salt okunur yapar. De\u011fi\u015ftirilemez nesneler olu\u015fturmak i\u00e7in idealdir.<\/li>\n<li><code>Pick<T, K><\/code>: Bir tipin (<code>T<\/code>) belirli \u00f6zelliklerini (<code>K<\/code>) se\u00e7erek yeni bir tip olu\u015fturur.<\/li>\n<li><code>Exclude<T, U><\/code>: Birle\u015fim (union) tiplerinden belirli elemanlar\u0131 \u00e7\u0131kar\u0131r.<\/li>\n<li><code>Record<K, T><\/code>: Belirli anahtar (<code>K<\/code>) ve de\u011fer (<code>T<\/code>) tiplerine sahip bir nesne tipi olu\u015fturur.<\/li>\n<li><code>ReturnType<T><\/code>: Bir fonksiyon tipinin d\u00f6n\u00fc\u015f tipini (return type) elde eder.<\/li>\n<\/ul>\n<p>Bu tiplerin her biri, belirli bir ihtiyaca y\u00f6nelik olarak tasarlanm\u0131\u015ft\u0131r ve birlikte kullan\u0131ld\u0131klar\u0131nda \u00e7ok g\u00fc\u00e7l\u00fc kombinasyonlar olu\u015fturabilirler. \u00d6rne\u011fin, bir API iste\u011fi i\u00e7in sadece belirli alanlar\u0131 g\u00f6ndermeniz gerekti\u011finde <code>Pick<\/code> kullanmak, veya bir form g\u00fcncellemesi yaparken sadece de\u011fi\u015fen alanlar\u0131 g\u00f6ndermek i\u00e7in <code>Partial<\/code> kullanmak, tip g\u00fcvenli\u011fini korurken esneklik sa\u011flar. Utility tipleri, tip sistemini dinamik ve esnek bir \u015fekilde y\u00f6netmemizi sa\u011flayarak, kod kalitesini art\u0131r\u0131r, yeniden kullan\u0131labilirli\u011fi te\u015fvik eder ve geli\u015ftirme s\u00fcrecindeki hatalar\u0131 minimize eder.<\/p>\n<p>Bu makalede \u00f6zellikle odaklanaca\u011f\u0131m\u0131z <code>Omit<T, K><\/code> tipi de, bu g\u00fc\u00e7l\u00fc ara\u00e7 setinin \u00f6nemli bir par\u00e7as\u0131d\u0131r. <code>Pick<\/code>'in bir nevi z\u0131t kutbu gibi \u00e7al\u0131\u015farak, bir tipten belirli \u00f6zellikleri \"\u00e7\u0131karmam\u0131z\u0131\" sa\u011flar. Bu sayede, ba\u015flang\u0131\u00e7ta \u00e7ok geni\u015f tan\u0131mlanm\u0131\u015f bir ana tipten, farkl\u0131 ba\u011flamlar i\u00e7in \u00f6zel, daralt\u0131lm\u0131\u015f tipler t\u00fcretebiliriz. B\u00f6ylece, gereksiz veya hassas verilerin yanl\u0131\u015f yerlerde kullan\u0131lmas\u0131n\u0131 engelleyerek hem tip g\u00fcvenli\u011fini hem de uygulama g\u00fcvenli\u011fini art\u0131rm\u0131\u015f oluruz.<\/p>\n<h2 id=\"omit-nedir-nasil-kullanilir\">Omit Utility Tipi Nedir ve Belirli \u00d6zellikleri Bir Tiplerden Nas\u0131l Kald\u0131r\u0131r\u0131z?<\/h2>\n<p>TypeScript'in Utility Tipleri aras\u0131nda \u00f6ne \u00e7\u0131kan <code>Omit<T, K><\/code>, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere, mevcut bir tipten (<code>T<\/code>) belirli \u00f6zellikleri (<code>K<\/code>) \"\u00e7\u0131karmak\" veya \"atlamak\" i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle bir objenin t\u00fcm \u00f6zelliklerine ihtiyac\u0131n\u0131z olmad\u0131\u011f\u0131 veya baz\u0131 hassas bilgileri belirli ba\u011flamlarda gizlemeniz gerekti\u011fi durumlarda son derece kullan\u0131\u015fl\u0131d\u0131r. <code>Omit<\/code>, kodunuzu daha mod\u00fcler, okunabilir ve tip g\u00fcvenli\u011fi a\u00e7\u0131s\u0131ndan daha sa\u011flam hale getirir.<\/p>\n<p>Temel sentaks\u0131 olduk\u00e7a basittir:<\/p>\n<pre><code>\ntype YeniTip = Omit<MevcutTip, \"kaldirilacakOzellik1\" | \"kaldirilacakOzellik2\">;\n\n<\/pre>\n<p><\/code><\/p>\n<p>Burada:<\/p>\n<ul>\n<li><code>MevcutTip<\/code>: \u00d6zelliklerini \u00e7\u0131karmak istedi\u011finiz orijinal tiptir.<\/li>\n<li><code>\"kaldirilacakOzellik1\" | \"kaldirilacakOzellik2\"<\/code>: Orijinal tipten \u00e7\u0131kar\u0131lacak \u00f6zelliklerin string literal birle\u015fimidir (union type). Bu k\u0131sma birden fazla \u00f6zellik ekleyebilirsiniz.<\/li>\n<\/ul>\n<p>Gelin, basit bir \u00f6rnekle <code>Omit<\/code>'in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyelim. Bir kullan\u0131c\u0131 y\u00f6netim sistemi i\u00e7in temel bir <code>Kullanici<\/code> tipimiz olsun:<\/p>\n<pre><code>\ninterface Kullanici {\n  id: string;\n  ad: string;\n  email: string;\n  sifreHash: string; \/\/ Hassas bilgi\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Kullanici<\/code> tipi, veritaban\u0131nda saklanan t\u00fcm bilgileri i\u00e7erir. Ancak, bir API'den kullan\u0131c\u0131 verilerini frontend'e g\u00f6nderirken veya bir kullan\u0131c\u0131n\u0131n herkese a\u00e7\u0131k profilini g\u00f6sterirken <code>sifreHash<\/code> gibi hassas bilgileri veya <code>createdAt<\/code>, <code>updatedAt<\/code> gibi sadece backend i\u00e7in \u00f6nemli olan zaman damgalar\u0131n\u0131 g\u00f6ndermek istemeyiz. \u0130\u015fte bu noktada <code>Omit<\/code> devreye girer:<\/p>\n<pre><code>\n\/\/ Frontend'e g\u00f6nderilecek g\u00fcvenli kullan\u0131c\u0131 tipi\ntype GuvenliKullanici = Omit<Kullanici, \"sifreHash\" | \"createdAt\" | \"updatedAt\">;\n\n\/\/ \u015eimdi bu tiplerle \u00f6rneklere bakal\u0131m:\nconst tamKullanici: Kullanici = {\n  id: \"abc-123\",\n  ad: \"Gizem\",\n  email: \"gizem@example.com\",\n  sifreHash: \"some_secret_hash_value\",\n  createdAt: new Date(),\n  updatedAt: new Date(),\n};\n\n\/\/ GuvenliKullanici tipindeki bir obje, sifreHash, createdAt ve updatedAt \u00f6zelliklerini i\u00e7eremez.\nconst frontendKullanici: GuvenliKullanici = {\n  id: \"abc-123\",\n  ad: \"Gizem\",\n  email: \"gizem@example.com\",\n  \/\/ sifreHash, createdAt, updatedAt burada olmayacak!\n};\n\n\/\/ Hata: Tip 'Kullanici' tipine atanamaz.\n\/\/ Nesne de\u011fi\u015fmez de\u011feri 'sifreHash' \u00f6zelli\u011fine sahip, ancak 'GuvenliKullanici' t\u00fcr\u00fc bunu gerektirmiyor.\n\/\/ const hataOrnegi: GuvenliKullanici = tamKullanici;\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>GuvenliKullanici<\/code> tipi, orijinal <code>Kullanici<\/code> tipinden <code>sifreHash<\/code>, <code>createdAt<\/code> ve <code>updatedAt<\/code> \u00f6zelliklerini ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7\u0131karm\u0131\u015ft\u0131r. Bu sayede, frontend'e gidecek veya herkese a\u00e7\u0131k bir ba\u011flamda kullan\u0131lacak verilerin sadece gerekli ve g\u00fcvenli alanlar\u0131 i\u00e7erdi\u011finden emin olabiliriz. Bu yakla\u015f\u0131m, yanl\u0131\u015fl\u0131kla hassas verilerin if\u015fa edilmesini \u00f6nler ve uygulaman\u0131z\u0131n genel g\u00fcvenlik post\u00fcr\u00fcn\u00fc art\u0131r\u0131r.<\/p>\n<p><code>Omit<\/code> kullanman\u0131n avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Tip G\u00fcvenli\u011fi:<\/strong> Bir tipten a\u00e7\u0131k\u00e7a belirli \u00f6zellikleri \u00e7\u0131kararak, o \u00f6zelliklerin yanl\u0131\u015fl\u0131kla kullan\u0131lmas\u0131n\u0131 engellersiniz.<\/li>\n<li><strong>Niyetin A\u00e7\u0131k\u00e7a Belirtilmesi:<\/strong> Kodunuz, belirli bir ba\u011flamda hangi \u00f6zelliklerin kas\u0131tl\u0131 olarak hari\u00e7 tutuldu\u011funu net bir \u015fekilde g\u00f6sterir. Bu, kodun okunabilirli\u011fini ve anla\u015f\u0131labilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Kod Tekrar\u0131n\u0131 Azaltma:<\/strong> Orijinal tipi her seferinde kopyalay\u0131p manuel olarak alanlar\u0131 silmek yerine, <code>Omit<\/code> ile tek sat\u0131rda yeni bir tip t\u00fcretebilirsiniz.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Orijinal <code>Kullanici<\/code> tipinde yeni bir \u00f6zellik eklendi\u011finde veya \u00e7\u0131kar\u0131ld\u0131\u011f\u0131nda, <code>Omit<\/code> kullanan t\u00fcretilmi\u015f tipler otomatik olarak g\u00fcncellenir (e\u011fer \u00e7\u0131kar\u0131lan \u00f6zellikler listesinde de\u011filse). Bu, manuel m\u00fcdahale ihtiyac\u0131n\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, <code>Omit<\/code> utility tipi, TypeScript projelerinizde tip y\u00f6netimini daha sofistike ve g\u00fcvenli bir seviyeye ta\u015f\u0131yan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. \u00d6zellikle farkl\u0131 katmanlar veya bile\u015fenler aras\u0131nda veri transferi yaparken, veri modellerinizin spesifik ihtiya\u00e7lara g\u00f6re uyarlanmas\u0131n\u0131 sa\u011flayarak gereksiz karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131r\u0131r ve olas\u0131 hatalar\u0131 \u00f6nler.<\/p>\n<h2 id=\"api-cevabini-guvenli-hale-getirmek\">Bir API Cevab\u0131n\u0131 Frontend \u0130\u00e7in G\u00fcvenli Hale Getirmek: Omit ile Pratik Bir Vaka Analizi<\/h2>\n<p>Modern web uygulamalar\u0131nda, backend API'lerinden gelen veriler genellikle frontend'de do\u011frudan kullan\u0131landan \u00e7ok daha fazlas\u0131n\u0131 i\u00e7erir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n veritaban\u0131 kayd\u0131, g\u00fcvenlik hashi, i\u00e7 sistem zaman damgalar\u0131, hatta di\u011fer hassas ili\u015fkilendirmeler gibi front-end i\u00e7in gereksiz veya tehlikeli olabilecek bilgileri bar\u0131nd\u0131rabilir. Bu t\u00fcr verilerin, uygulaman\u0131z\u0131n farkl\u0131 katmanlar\u0131 aras\u0131nda uygun filtreleme yap\u0131lmadan do\u011frudan aktar\u0131lmas\u0131, g\u00fcvenlik a\u00e7\u0131klar\u0131 yaratabilece\u011fi gibi, gereksiz yere b\u00fcy\u00fck veri y\u00fcklerinin ta\u015f\u0131nmas\u0131na da neden olabilir.<\/p>\n<p>Bu senaryoyu somutla\u015ft\u0131ral\u0131m: Bir e-ticaret uygulamas\u0131nda \"\u00dcr\u00fcn\" objemiz var. Backend taraf\u0131nda bu \u00fcr\u00fcn\u00fcn tam tipi \u015f\u00f6yle tan\u0131mlanm\u0131\u015f olsun:<\/p>\n<pre><code>\ninterface UrunVT {\n  id: string;\n  ad: string;\n  aciklama: string;\n  fiyat: number;\n  stokAdedi: number;\n  tedarikciId: string; \/\/ \u0130\u00e7 sistem bilgisi\n  createdAt: Date;\n  updatedAt: Date;\n  metaData: Record<string, any>; \/\/ Ekstra, potansiyel olarak b\u00fcy\u00fck veriler\n}\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>UrunVT<\/code> (Veritaban\u0131 \u00dcr\u00fcn\u00fc) tipi, backend taraf\u0131nda her \u015feyi i\u00e7erir. Ancak, frontend'de bir \u00fcr\u00fcn listesini veya \u00fcr\u00fcn detay sayfas\u0131n\u0131 g\u00f6sterirken, <code>tedarikciId<\/code>, <code>createdAt<\/code>, <code>updatedAt<\/code> ve \u00f6zellikle <code>metaData<\/code> gibi bilgilerin g\u00f6sterilmesine gerek yoktur. Hatta, <code>tedarikciId<\/code> gibi bilgilerin frontend'e s\u0131zmas\u0131, i\u015f mant\u0131\u011f\u0131na dair istemedi\u011fimiz bilgilerin if\u015fa olmas\u0131na neden olabilir.<\/p>\n<p>Eskiden bu t\u00fcr durumlar\u0131 y\u00f6netmek i\u00e7in iki yayg\u0131n yakla\u015f\u0131m vard\u0131:<\/p>\n<ol>\n<li><strong>Manuel Mapping:<\/strong> Backend'den gelen <code>UrunVT<\/code> objesini al\u0131p, her bir \u00f6zelli\u011fini tek tek frontend i\u00e7in uygun bir objeye kopyalamak. Bu y\u00f6ntem, b\u00fcy\u00fck objelerde tekrarlay\u0131c\u0131 ve hataya a\u00e7\u0131k olabilir.<\/li>\n<li><strong><code>Partial<\/code> Yanl\u0131\u015f Kullan\u0131m\u0131:<\/strong> Bazen, \"sadece bu alanlar gerekli\" diyerek <code>Partial<UrunVT><\/code> kullan\u0131l\u0131rd\u0131, ancak bu, hala orijinal tipten potansiyel olarak istenmeyen alanlar\u0131n gelebilece\u011fi anlam\u0131na geliyordu ve tip g\u00fcvenli\u011fi a\u00e7\u0131s\u0131ndan tam bir \u00e7\u00f6z\u00fcm de\u011fildi.<\/li>\n<\/ol>\n<p><code>Omit<\/code> ile bu problemi zarif ve tip g\u00fcvenli bir \u015fekilde \u00e7\u00f6zebiliriz. Frontend i\u00e7in bir <code>UrunGorunumu<\/code> tipi olu\u015ftural\u0131m:<\/p>\n<pre><code>\n\/\/ Frontend'de \u00fcr\u00fcn g\u00f6stermek i\u00e7in g\u00fcvenli ve sadele\u015ftirilmi\u015f tip\ntype UrunGorunumu = Omit<UrunVT, \"tedarikciId\" | \"createdAt\" | \"updatedAt\" | \"metaData\">;\n\n\/\/ Backend'den gelen \u00f6rnek bir \u00fcr\u00fcn objesi\nconst dbUrun: UrunVT = {\n  id: \"p-001\",\n  ad: \"Ak\u0131ll\u0131 Telefon X\",\n  aciklama: \"En yeni nesil ak\u0131ll\u0131 telefon...\",\n  fiyat: 12999.99,\n  stokAdedi: 150,\n  tedarikciId: \"sup-456\",\n  createdAt: new Date(\"2023-01-15T10:00:00Z\"),\n  updatedAt: new Date(\"2023-03-20T14:30:00Z\"),\n  metaData: {\n    garanti: \"2 y\u0131l\",\n    boyutlar: \"150x70x8mm\",\n  },\n};\n\n\/\/ Bu objeyi frontend'e g\u00f6ndermeden \u00f6nce UrunGorunumu tipine d\u00f6n\u00fc\u015ft\u00fcrelim\nfunction frontendIcinUrunHazirla(urun: UrunVT): UrunGorunumu {\n  const { tedarikciId, createdAt, updatedAt, metaData, ...rest } = urun;\n  return rest;\n}\n\nconst goruntulenecekUrun: UrunGorunumu = frontendIcinUrunHazirla(dbUrun);\n\nconsole.log(goruntulenecekUrun);\n\/\/ \u00c7\u0131kt\u0131:\n\/\/ {\n\/\/   id: 'p-001',\n\/\/   ad: 'Ak\u0131ll\u0131 Telefon X',\n\/\/   aciklama: 'En yeni nesil ak\u0131ll\u0131 telefon...',\n\/\/   fiyat: 12999.99,\n\/\/   stokAdedi: 150\n\/\/ }\n\n\/\/ goruntulenecekUrun.tedarikciId; \/\/ TypeScript hatas\u0131 verir: 'tedarikciId' \u00f6zelli\u011fi 'UrunGorunumu' \u00fczerinde yok.\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m\u0131n avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>API S\u00f6zle\u015fmesinin Netli\u011fi:<\/strong> Frontend, hangi verilere eri\u015febilece\u011fini ve hangi verilere eri\u015femeyece\u011fini net bir \u015fekilde bilir. Bu, backend ve frontend ekipleri aras\u0131ndaki ileti\u015fimi g\u00fc\u00e7lendirir.<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> Hassas verilerin yanl\u0131\u015fl\u0131kla frontend'e s\u0131zmas\u0131n\u0131 engeller. Bu, \u00f6zellikle hassas ki\u015fisel bilgiler veya i\u015f s\u0131rlar\u0131 i\u00e7eren verilerle \u00e7al\u0131\u015f\u0131rken kritik \u00f6neme sahiptir.<\/li>\n<li><strong>Performans Optimizasyonu:<\/strong> Frontend'e sadece gerekli verileri g\u00f6ndererek a\u011f y\u00fck\u00fcn\u00fc azalt\u0131r ve uygulaman\u0131n daha h\u0131zl\u0131 y\u00fcklenmesine katk\u0131da bulunur.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> <code>UrunVT<\/code> tipi de\u011fi\u015fti\u011finde (\u00f6rne\u011fin yeni bir alan eklendi\u011finde), <code>UrunGorunumu<\/code> tipi otomatik olarak g\u00fcncellenir ve manuel d\u00fczenlemeler yapman\u0131za gerek kalmaz (\u00e7\u0131kar\u0131lan alanlar listesi de\u011fi\u015fmedi\u011fi s\u00fcrece).<\/li>\n<li><strong>Hata Azaltma:<\/strong> Runtime hatalar\u0131n\u0131n olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r, \u00e7\u00fcnk\u00fc tip sistemi frontend'in bekledi\u011fi verileri tam olarak bilmesini sa\u011flar.<\/li>\n<\/ul>\n<p>Bu vaka analizi, <code>Omit<\/code>'in sadece teorik bir konsept olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda g\u00fcnl\u00fck geli\u015ftirme pratiklerinde kar\u015f\u0131la\u015f\u0131lan ger\u00e7ek d\u00fcnya problemlerini \u00e7\u00f6zmek i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve pratik bir ara\u00e7 oldu\u011funu g\u00f6stermektedir. Frontend ve backend aras\u0131ndaki veri k\u00f6pr\u00fcs\u00fcn\u00fc daha sa\u011flam ve g\u00fcvenli hale getirerek, daha kaliteli ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmenize olanak tan\u0131r.<\/p>\n<h3 id=\"omit-vs-pick\">Omit mi, Pick mi? Hangi Durumda Hangisini Tercih Etmelisiniz?<\/h3>\n<p>TypeScript'in iki \u00f6nemli Utility Tipi olan <code>Omit<\/code> ve <code>Pick<\/code>, her ikisi de mevcut bir tipten yeni tipler t\u00fcretmek i\u00e7in kullan\u0131l\u0131r, ancak farkl\u0131 yakla\u015f\u0131mlara sahiptirler ve farkl\u0131 senaryolarda daha uygun olabilirler. Bu iki g\u00fc\u00e7l\u00fc arac\u0131 do\u011fru bir \u015fekilde kullanmak, kodunuzun netli\u011fini ve tip g\u00fcvenli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<p>\u00d6ncelikle <code>Pick<T, K><\/code>'i hat\u0131rlayal\u0131m. <code>Pick<\/code>, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bir tipin (<code>T<\/code>) belirli \u00f6zelliklerini (<code>K<\/code>) se\u00e7erek yeni bir tip olu\u015fturur. Yani, \"bu tipten sadece bu \u00f6zellikleri istiyorum\" demek istedi\u011finizde <code>Pick<\/code> kullan\u0131rs\u0131n\u0131z. Sentaks\u0131 \u015fu \u015fekildedir:<\/p>\n<pre><code>\ntype SecilenTip = Pick<OrijinalTip, \"ozellik1\" | \"ozellik2\">;\n\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6rnek:<\/p>\n<pre><code>\ninterface Kitap {\n  id: string;\n  baslik: string;\n  yazar: string;\n  sayfaSayisi: number;\n  isbn: string;\n  yayinTarihi: Date;\n}\n\n\/\/ Bir kitap listesini g\u00f6sterirken sadece ba\u015fl\u0131k ve yazar yeterli olabilir\ntype KitapOzeti = Pick<Kitap, \"baslik\" | \"yazar\">;\n\nconst ornekKitap: Kitap = {\n  id: \"k-001\",\n  baslik: \"Sava\u015f ve Bar\u0131\u015f\",\n  yazar: \"Lev Tolstoy\",\n  sayfaSayisi: 1225,\n  isbn: \"978-0140447939\",\n  yayinTarihi: new Date(\"1869-01-01\"),\n};\n\nconst kitapOzeti: KitapOzeti = {\n  baslik: ornekKitap.baslik,\n  yazar: ornekKitap.yazar,\n};\n\n\/\/ kitapOzeti.sayfaSayisi; \/\/ Hata: 'sayfaSayisi' \u00f6zelli\u011fi 'KitapOzeti' \u00fczerinde yok.\n\n<\/pre>\n<p><\/code><\/p>\n<p>Peki, <code>Omit<\/code> ve <code>Pick<\/code> aras\u0131ndaki temel fark nedir ve ne zaman hangisini kullanmal\u0131s\u0131n\u0131z?<\/p>\n<ul>\n<li>\n        <strong><code>Pick<\/code>: Dahil Etme (Whitelist Yakla\u015f\u0131m\u0131)<\/strong><\/p>\n<ul>\n<li><strong>Mant\u0131k:<\/strong> \"Bu tipten SADECE belirtilen \u00f6zellikleri al.\"<\/li>\n<li><strong>Kullan\u0131m Senaryosu:<\/strong> Orijinal tipin \u00e7ok say\u0131da \u00f6zelli\u011fi varken, yeni tipinize sadece k\u00fc\u00e7\u00fck bir alt k\u00fcmesini dahil etmek istedi\u011finizde. Bu, \"beyaz liste\" (whitelist) yakla\u015f\u0131m\u0131 olarak da bilinir. G\u00fcvenlik odakl\u0131 senaryolarda, izin verilen \u00f6zelliklerin a\u00e7\u0131k\u00e7a belirtilmesi tercih edildi\u011finde idealdir.<\/li>\n<li><strong>Avantaj\u0131:<\/strong> Hata yapma olas\u0131l\u0131\u011f\u0131 daha d\u00fc\u015f\u00fckt\u00fcr, \u00e7\u00fcnk\u00fc sadece a\u00e7\u0131k\u00e7a izin verilen alanlar yeni tipe dahil edilir.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong><code>Omit<\/code>: Hari\u00e7 Tutma (Blacklist Yakla\u015f\u0131m\u0131)<\/strong><\/p>\n<ul>\n<li><strong>Mant\u0131k:<\/strong> \"Bu tipten belirtilen \u00f6zellikleri \u00c7IKAR, kalan her \u015feyi al.\"<\/li>\n<li><strong>Kullan\u0131m Senaryosu:<\/strong> Orijinal tipin neredeyse t\u00fcm \u00f6zelliklerine ihtiyac\u0131n\u0131z varken, sadece birka\u00e7 tanesini hari\u00e7 tutmak istedi\u011finizde. Bu, \"kara liste\" (blacklist) yakla\u015f\u0131m\u0131 olarak da bilinir. \u00d6zellikle hassas bilgileri veya belirli bir ba\u011flamda gereksiz olanlar\u0131 gizlemek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><strong>Avantaj\u0131:<\/strong> Geni\u015f bir tipten birka\u00e7 alan\u0131 kolayca \u00e7\u0131karman\u0131z\u0131 sa\u011flar, b\u00f6ylece kalan t\u00fcm \u00f6zellikleri manuel olarak listelemenize gerek kalmaz.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Hangi durumlarda hangisini se\u00e7ece\u011finize karar verirken a\u015fa\u011f\u0131daki basit kural\u0131 d\u00fc\u015f\u00fcnebilirsiniz:<\/p>\n<ul>\n<li>E\u011fer yeni tipiniz, orijinal tipin <strong>\u00e7ok k\u00fc\u00e7\u00fck bir k\u0131sm\u0131n\u0131<\/strong> i\u00e7eriyorsa, <strong><code>Pick<\/code><\/strong> kullanmak daha mant\u0131kl\u0131d\u0131r. Daha az kod yazars\u0131n\u0131z ve niyetiniz daha net olur.<\/li>\n<li>E\u011fer yeni tipiniz, orijinal tipin <strong>b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131<\/strong> i\u00e7eriyor ve sadece <strong>birka\u00e7 \u00f6zelli\u011fi d\u0131\u015flamak<\/strong> istiyorsan\u0131z, <strong><code>Omit<\/code><\/strong> kullanmak daha pratiktir.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, <code>Kitap<\/code> tipimizden sadece <code>id<\/code> ve <code>isbn<\/code>'i \u00e7\u0131kar\u0131p geri kalan her \u015feyi isteseydik, <code>Omit<\/code> kullanmak daha k\u0131sa ve okunabilir olurdu, \u00e7\u00fcnk\u00fc <code>baslik<\/code>, <code>yazar<\/code>, <code>sayfaSayisi<\/code>, <code>yayinTarihi<\/code>'ni tek tek <code>Pick<\/code> ile listelemek yerine, sadece \u00e7\u0131kar\u0131lacak iki alan\u0131 belirtmek yeterli olurdu.<\/p>\n<pre><code>\n\/\/ id ve isbn hari\u00e7 t\u00fcm Kitap \u00f6zelliklerini i\u00e7eren bir tip\ntype KitapDetay = Omit<Kitap, \"id\" | \"isbn\">;\n\nconst detayliKitap: KitapDetay = {\n  baslik: \"Sava\u015f ve Bar\u0131\u015f\",\n  yazar: \"Lev Tolstoy\",\n  sayfaSayisi: 1225,\n  yayinTarihi: new Date(\"1869-01-01\"),\n};\n\n<\/pre>\n<p><\/code><\/p>\n<p>Her iki Utility Tipi de TypeScript'in tip sistemini daha esnek ve g\u00fc\u00e7l\u00fc hale getirir. Do\u011fru yerde do\u011fru arac\u0131 se\u00e7mek, kodunuzun hem okunabilirli\u011fini hem de bak\u0131m kolayl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<h2 id=\"ileri-duzey-omit-kullanimlari\">Daha Karma\u015f\u0131k Senaryolar \u0130\u00e7in Omit'i Di\u011fer Utility Tipleriyle Nas\u0131l Birle\u015ftirebilirsiniz?<\/h2>\n<p><code>Omit<\/code> utility tipi tek ba\u015f\u0131na bile olduk\u00e7a g\u00fc\u00e7l\u00fcd\u00fcr, ancak TypeScript'in di\u011fer utility tipleriyle birle\u015ftirildi\u011finde ger\u00e7ek potansiyelini ortaya \u00e7\u0131kar\u0131r. Bu kombinasyonlar, daha karma\u015f\u0131k veri modelleri ve i\u015f mant\u0131\u011f\u0131 senaryolar\u0131nda tip g\u00fcvenli\u011fini korurken inan\u0131lmaz bir esneklik sunar. Geli\u015ftiricilerin, mevcut tipleri kullanarak farkl\u0131 ihtiya\u00e7lara y\u00f6nelik \u00f6zel tipler t\u00fcretmesini sa\u011flar.<\/p>\n<p>\u00d6ncelikle, temel bir <code>Gorev<\/code> tipini tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\ninterface Gorev {\n  id: string;\n  baslik: string;\n  aciklama: string;\n  sonTeslimTarihi: Date;\n  tamamlandiMi: boolean;\n  atananKullaniciId: string;\n  etiketler?: string[]; \/\/ Opsiyonel\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n<\/pre>\n<p><\/code><\/p>\n<h3>1. Omit ve Partial Kombinasyonu: Yeni Kay\u0131t Olu\u015fturma Senaryosu<\/h3>\n<p>Yeni bir g\u00f6rev olu\u015ftururken, <code>id<\/code>, <code>createdAt<\/code> ve <code>updatedAt<\/code> gibi sistem taraf\u0131ndan otomatik olarak atanacak alanlara ihtiyac\u0131m\u0131z yoktur. Ayr\u0131ca, <code>etiketler<\/code> zaten opsiyonel oldu\u011fu gibi, <code>tamamlandiMi<\/code> gibi baz\u0131 alanlar da ba\u015flang\u0131\u00e7ta varsay\u0131lan bir de\u011fere sahip olabilir ve kullan\u0131c\u0131 taraf\u0131ndan girilmesi zorunlu olmayabilir. Bu durumda, <code>Omit<\/code> ve <code>Partial<\/code>'\u0131 birle\u015ftirebiliriz:<\/p>\n<pre><code>\n\/\/ Yeni g\u00f6rev olu\u015fturmak i\u00e7in gerekli tipler\ntype GorevOlusturmaTemel = Omit<Gorev, \"id\" | \"createdAt\" | \"updatedAt\">;\n\n\/\/ Ek olarak baz\u0131 alanlar\u0131 da opsiyonel yapal\u0131m (\u00f6rne\u011fin tamamlandiMi, aciklama)\ntype YeniGorevDTO = Partial<Omit<Gorev, \"id\" | \"createdAt\" | \"updatedAt\">>;\n\n\/\/ VEYA, daha spesifik hale getirelim:\ntype YeniGorev =\n  Omit<Gorev, \"id\" | \"createdAt\" | \"updatedAt\"> &\/\/ \u00d6nce kald\u0131r\u0131lacaklar\u0131 belirle\n  Partial<Pick<Gorev, \"aciklama\" | \"tamamlandiMi\" | \"etiketler\">>; \/\/ Sonra bunlardan opsiyonel olanlar\u0131 se\u00e7\n\n\/\/ Hatta daha okunakl\u0131:\ntype OmitGereksizAlanlar = Omit<Gorev, \"id\" | \"createdAt\" | \"updatedAt\">;\ntype YeniGorevDTOOkunakli = Partial<OmitGereksizAlanlar>;\n\nconst yeniGorevVerisi: YeniGorevDTOOkunakli = {\n  baslik: \"Raporu tamamla\",\n  sonTeslimTarihi: new Date(\"2023-12-31\"),\n  atananKullaniciId: \"user-456\",\n  \/\/ aciklama ve tamamlandiMi burada opsiyoneldir, vermesek de olur.\n};\n\n\/\/ Hata: 'baslik' \u00f6zelli\u011fi 'YeniGorevDTOOkunakli' \u00fczerinde mevcut de\u011fil, ancak 'baslik' gereklidir.\n\/\/ const hataGorev: YeniGorevDTOOkunakli = {\n\/\/   sonTeslimTarihi: new Date(),\n\/\/   atananKullaniciId: \"user-456\",\n\/\/ };\n\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, \u00f6nce <code>Omit<\/code> ile gereksiz alanlar\u0131 kald\u0131rd\u0131k, ard\u0131ndan kalan alanlar\u0131n tamam\u0131n\u0131 <code>Partial<\/code> ile opsiyonel hale getirdik. Bu sayede, yeni g\u00f6rev olu\u015ftururken sadece zorunlu alanlar\u0131 girmemiz gerekti\u011fi, di\u011ferlerinin iste\u011fe ba\u011fl\u0131 oldu\u011fu netle\u015fti.<\/p>\n<h3>2. Omit ve Required Kombinasyonu: Form G\u00fcncelleme veya Validasyon Senaryosu<\/h3>\n<p>Bazen bir objeden baz\u0131 alanlar\u0131 \u00e7\u0131karmak isterken, kalan t\u00fcm alanlar\u0131n mutlaka doldurulmu\u015f olmas\u0131n\u0131 isteyebiliriz. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n profilini g\u00fcncellerken <code>id<\/code> ve <code>createdAt<\/code> gibi de\u011fi\u015fmeyen alanlar\u0131 \u00e7\u0131karmak ve kalan t\u00fcm alanlar\u0131n (<code>ad<\/code>, <code>email<\/code> vb.) zorunlu olmas\u0131n\u0131 sa\u011flamak isteyebiliriz. Bu, bir form validasyonunda veya bir g\u00fcncelleme DTO'sunda (Data Transfer Object) yayg\u0131n bir ihtiya\u00e7t\u0131r.<\/p>\n<pre><code>\n\/\/ Kullan\u0131c\u0131 profil g\u00fcncelleme tipleri\ninterface KullaniciProfil {\n  id: string;\n  ad: string;\n  soyad: string;\n  email: string;\n  telefonNumarasi?: string; \/\/ Opsiyonel\n  adres?: string; \/\/ Opsiyonel\n  createdAt: Date;\n}\n\ntype KullaniciProfilGuncellemeDTO = Required<Omit<KullaniciProfil, \"id\" | \"createdAt\">>;\n\nconst guncelProfil: KullaniciProfilGuncellemeDTO = {\n  ad: \"Caner\",\n  soyad: \"Y\u0131lmaz\",\n  email: \"caner.yilmaz@example.com\",\n  telefonNumarasi: \"5559876543\", \/\/ Art\u0131k zorunlu\n  adres: \"Yeni Adres Sok. No:5\", \/\/ Art\u0131k zorunlu\n};\n\n\/\/ Hata: 'adres' \u00f6zelli\u011fi 'KullaniciProfilGuncellemeDTO' \u00fczerinde mevcut de\u011fil, ancak 'adres' gereklidir.\n\/\/ const eksikGuncelProfil: KullaniciProfilGuncellemeDTO = {\n\/\/   ad: \"Caner\",\n\/\/   soyad: \"Y\u0131lmaz\",\n\/\/   email: \"caner.yilmaz@example.com\",\n\/\/   telefonNumarasi: \"5559876543\",\n\/\/ };\n\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>id<\/code> ve <code>createdAt<\/code> \u00e7\u0131kar\u0131ld\u0131ktan sonra, orijinal <code>KullaniciProfil<\/code> tipindeki opsiyonel alanlar (<code>telefonNumarasi<\/code>, <code>adres<\/code>) dahil, kalan t\u00fcm alanlar <code>Required<\/code> ile zorunlu hale getirildi.<\/p>\n<h3>3. Omit ve Pick ile Dinamik Tipler Olu\u015fturma<\/h3>\n<p>Bazen \u00e7ok spesifik bir ihtiyaca y\u00f6nelik tip olu\u015fturman\u0131z gerekebilir. \u00d6rne\u011fin, bir objeden belirli alanlar\u0131 \u00e7\u0131kar\u0131p, kalanlardan da sadece belirli bir alt k\u00fcmeyi se\u00e7mek isteyebilirsiniz. Bu senaryo biraz nadir olsa da, karma\u015f\u0131k durumlarda esneklik sa\u011flar:<\/p>\n<pre><code>\ninterface UrunDetay {\n  urunId: string;\n  ad: string;\n  aciklama: string;\n  fiyat: number;\n  stokAdedi: number;\n  tedarikciAdi: string;\n  kategori: string;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n\/\/ tedarikciAdi ve createdAt\/updatedAt'i \u00e7\u0131kar\u0131p, kalanlardan sadece ad, fiyat ve kategori'yi al.\ntype UrunKartOzellikleri = Pick<Omit<UrunDetay, \"tedarikciAdi\" | \"createdAt\" | \"updatedAt\">, \"ad\" | \"fiyat\" | \"kategori\">;\n\nconst urunKart: UrunKartOzellikleri = {\n  ad: \"Laptop Pro\",\n  fiyat: 25000.00,\n  kategori: \"Elektronik\",\n};\n\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>Omit<\/code>'i di\u011fer utility tipleriyle birle\u015ftirmek, TypeScript'te tip g\u00fcvenli\u011fini korurken inan\u0131lmaz derecede esnek ve \u00f6zelle\u015ftirilebilir veri modelleri olu\u015fturman\u0131za olanak tan\u0131r. Bu sayede, her ba\u011flam i\u00e7in tam olarak do\u011fru veri yap\u0131s\u0131n\u0131 tan\u0131mlayabilir, gereksiz karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rabilir ve uygulaman\u0131z\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131rabilirsiniz. Bu ileri d\u00fczey teknikler, TypeScript'in tip sistemini etkin bir \u015fekilde kullanarak daha sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131mlar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2 id=\"refactor-stratejileri\">Mevcut Projenizi Omit Kullan\u0131m\u0131na Nas\u0131l Uyarlars\u0131n\u0131z? En \u0130yi Refactoring Pratikleri<\/h2>\n<p>Mevcut bir projede '?' operat\u00f6r\u00fcn\u00fcn yayg\u0131n olarak kullan\u0131ld\u0131\u011f\u0131 bir kod taban\u0131n\u0131 <code>Omit<\/code> gibi daha g\u00fcvenli utility tipleriyle refactor etmek, ba\u015flang\u0131\u00e7ta g\u00f6z korkutucu g\u00f6r\u00fcnebilir. Ancak do\u011fru stratejilerle, bu ge\u00e7i\u015fi sorunsuz ve kademeli bir \u015fekilde ger\u00e7ekle\u015ftirebilirsiniz. Bu s\u00fcre\u00e7, kod kalitenizi art\u0131rmakla kalmayacak, ayn\u0131 zamanda gelecekteki hatalar\u0131 \u00f6nleyerek geli\u015ftirici deneyiminizi de iyile\u015ftirecektir.<\/p>\n<h3>1. Problemli Alanlar\u0131 Belirleyin ve \u00d6nceliklendirin<\/h3>\n<p>Refactoring s\u00fcrecine ba\u015flamadan \u00f6nce, projenizdeki hangi '?' kullan\u0131mlar\u0131n\u0131n ger\u00e7ekten problem yaratt\u0131\u011f\u0131n\u0131 veya potansiyel risk ta\u015f\u0131d\u0131\u011f\u0131n\u0131 belirlemelisiniz. \u00d6zellikle a\u015fa\u011f\u0131daki durumlar y\u00fcksek \u00f6ncelikli olmal\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>Hassas Veriler:<\/strong> \u015eifreler, API anahtarlar\u0131, \u00f6zel kimlik bilgileri gibi frontend'e asla g\u00f6nderilmemesi gereken opsiyonel alanlar.<\/li>\n<li><strong>API Yan\u0131tlar\u0131:<\/strong> Backend'den gelen ve frontend'de sadece belirli alanlar\u0131na ihtiya\u00e7 duyulan b\u00fcy\u00fck objeler.<\/li>\n<li><strong>Gereksiz <code>undefined<\/code> Kontrolleri:<\/strong> Kodunuzda s\u00fcrekli olarak <code>if (x?.y)<\/code> veya <code>x && x.y<\/code> gibi kontrollerle kar\u015f\u0131la\u015f\u0131yorsan\u0131z, bu, tip tan\u0131m\u0131n\u0131zda bir sorun oldu\u011funu g\u00f6sterebilir.<\/li>\n<\/ul>\n<h3>2. Kademeli Yakla\u015f\u0131m: B\u00fcy\u00fck Patlamadan Ka\u00e7\u0131n\u0131n<\/h3>\n<p>T\u00fcm '?' kullan\u0131mlar\u0131n\u0131 bir anda de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmak yerine, k\u00fc\u00e7\u00fck ad\u0131mlarla ilerleyin. \u00d6zellikle b\u00fcy\u00fck kod tabanlar\u0131nda bu, geri d\u00f6n\u00fc\u015f\u00fc olmayan hatalar\u0131 \u00f6nleyecektir. \u00d6rne\u011fin:<\/p>\n<ul>\n<li>Bir mod\u00fcl veya bir API endpoint'i baz\u0131nda refactoring yap\u0131n.<\/li>\n<li>Yeni geli\u015ftirilen \u00f6zelliklerde ba\u015ftan <code>Omit<\/code> ve di\u011fer utility tiplerini kullanma zorunlulu\u011fu getirin.<\/li>\n<\/ul>\n<pre><code>\n\/\/ \u00d6rnek: Eskiden\ninterface KullaniciAyarlari {\n  tema?: string;\n  dil?: \"tr\" | \"en\";\n  bildirimler?: boolean;\n}\n\n\/\/ Refactoring sonras\u0131: Yeni bir tip t\u00fcretelim\ntype KullaniciAyarlariGuncelleme = Omit<KullaniciAyarlari, \"id\"> & Partial<KullaniciAyarlari>;\n\n\/\/ Kullan\u0131m alanlar\u0131n\u0131 ad\u0131m ad\u0131m bu yeni tiplere g\u00f6re g\u00fcncelleyin.\n<\/pre>\n<p><\/code><\/p>\n<h3>3. Base Tiplerden T\u00fcretme ve Tip Hiyerar\u015fisi Olu\u015fturma<\/h3>\n<p><code>Omit<\/code> kullan\u0131m\u0131n\u0131 en verimli hale getirmenin yollar\u0131ndan biri, iyi tan\u0131mlanm\u0131\u015f \"base\" veya \"\u00e7ekirdek\" tipler olu\u015fturmakt\u0131r. Ard\u0131ndan, <code>Omit<\/code> ve di\u011fer utility tiplerini kullanarak bu base tiplerden daha spesifik tipler t\u00fcretin. Bu, tip hiyerar\u015finizi netle\u015ftirir ve kod tekrar\u0131n\u0131 azalt\u0131r.<\/p>\n<pre><code>\n\/\/ Base tip\ninterface TemelUrun {\n  id: string;\n  ad: string;\n  fiyat: number;\n  aciklama: string;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n\/\/ Frontend i\u00e7in \u00fcr\u00fcn listesi g\u00f6r\u00fcn\u00fcm\u00fc (sadece temel bilgileri i\u00e7erir)\ntype UrunListeGorunumu = Pick<TemelUrun, \"id\" | \"ad\" | \"fiyat\">;\n\n\/\/ \u00dcr\u00fcn detay sayfas\u0131 g\u00f6r\u00fcn\u00fcm\u00fc (baz\u0131 backend alanlar\u0131n\u0131 \u00e7\u0131kar\u0131r)\ntype UrunDetayGorunumu = Omit<TemelUrun, \"createdAt\" | \"updatedAt\">;\n\n\/\/ Yeni \u00fcr\u00fcn olu\u015fturma (id, createdAt, updatedAt \u00e7\u0131kar\u0131lm\u0131\u015f)\ntype YeniUrunOlusturma = Omit<TemelUrun, \"id\" | \"createdAt\" | \"updatedAt\">;\n\n<\/pre>\n<p><\/code><\/p>\n<h3>4. Kod \u0130ncelemelerinde Odaklanma<\/h3>\n<p>Ekip i\u00e7inde kod incelemeleri yaparken, yeni '?' i\u015faretlerinin veya gereksiz tip g\u00fcvenli\u011fi atlamalar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in <code>Omit<\/code> ve di\u011fer utility tiplerinin do\u011fru kullan\u0131m\u0131na odaklan\u0131n. Bu, ekip \u00fcyelerinin bu yeni yakla\u015f\u0131ma al\u0131\u015fmas\u0131na ve projenin genel tip g\u00fcvenli\u011fi seviyesini korumas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>5. Dezavantajlar\u0131 G\u00f6z Ard\u0131 Etmeyin<\/h3>\n<p><code>Omit<\/code> harika bir ara\u00e7 olsa da, bazen a\u015f\u0131r\u0131 kullan\u0131m\u0131 okunabilirli\u011fi azaltabilir. \u00c7ok say\u0131da i\u00e7 i\u00e7e <code>Omit<\/code>, <code>Pick<\/code> ve <code>Partial<\/code> kullanmak, tiplerin ne anlama geldi\u011fini takip etmeyi zorla\u015ft\u0131rabilir. Bu gibi durumlarda, daha a\u00e7\u0131k bir interface veya type tan\u0131m\u0131 olu\u015fturmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<blockquote class=\"interactive-element\">\n<p>Uzman \u0130pucu: Karma\u015f\u0131k tip kombinasyonlar\u0131 i\u00e7in anlaml\u0131 takma adlar (type alias) kullan\u0131n. \u00d6rne\u011fin: <code>type KullaniciGuncellemePayload = Required<Omit<Kullanici, \"id\" | \"createdAt\">>;<\/code> yerine, <code>type KullaniciGuncellemePayload = ZorunluKullaniciAlanlari;<\/code> \u015feklinde daha a\u00e7\u0131klay\u0131c\u0131 bir isim kullan\u0131n.<\/p>\n<\/blockquote>\n<h3>Mobil Uyumlu HTML \u0130\u00e7in K\u0131sa Bir Not (Genel \u0130lke)<\/h3>\n<p>Makale i\u00e7eri\u011fi direkt olarak mobil uyumluluk i\u00e7in HTML elementleri \u00fcretmese de, web geli\u015ftirmenin genel bir ilkesi olarak, Utility Tipleri ile olu\u015fturdu\u011funuz veri modellerini kullanarak olu\u015fturulan kullan\u0131c\u0131 aray\u00fczlerinin mobil uyumlu olmas\u0131 esast\u0131r. \u00d6rne\u011fin, <code>Omit<\/code> ile sadele\u015ftirdi\u011finiz bir <code>UrunGorunumu<\/code> tipindeki verileri g\u00f6stermek i\u00e7in a\u015fa\u011f\u0131daki gibi bir HTML ve CSS yap\u0131s\u0131 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-html\">\n<div class=\"product-card\">\n  <h3>{{ urun.ad }}<\/h3>\n  <p>Fiyat: {{ urun.fiyat }} TL<\/p>\n  <button>Sepete Ekle<\/button>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-css\"><\/pre>\n<p><\/code><br \/>\n.product-card {<br \/>\n  border: 1px solid #ccc;<br \/>\n  padding: 15px;<br \/>\n  margin: 10px;<br \/>\n  border-radius: 8px;<br \/>\n  \/* Daha fazla stil *\/<br \/>\n}<\/p>\n<p>@media (max-width: 768px) {<br \/>\n  .product-card {<br \/>\n    width: 100%; \/* Mobil cihazlarda kart\u0131n geni\u015fli\u011fini tam yap *\/<br \/>\n    box-sizing: border-box; \/* Padding'i kutu modeline dahil et *\/<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Bu, veri modeliniz ne kadar iyi olursa olsun, sunum katman\u0131nda (HTML\/CSS) yine de responsive tasar\u0131m prensiplerine uyman\u0131z gerekti\u011fini g\u00f6stermektedir. TypeScript'in tip g\u00fcvenli\u011fi, do\u011fru verilerin do\u011fru yerlere gitti\u011fini garanti ederken, CSS media query'leri bu verilerin t\u00fcm cihazlarda iyi g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<p>Projelerinizi <code>Omit<\/code> ve di\u011fer utility tipleriyle refactor etmek, uzun vadede daha az hata, daha temiz kod ve daha mutlu bir geli\u015ftirici ekibi anlam\u0131na gelecektir. Bu, TypeScript'in sundu\u011fu tip g\u00fcvenli\u011fi avantajlar\u0131n\u0131 tam anlam\u0131yla benimsemek ve kullanmak demektir.<\/p>\n<h2 id=\"sonuc-sss\">Sonu\u00e7: Kod Kalitenizi ve G\u00fcvenli\u011finizi Omit ile Art\u0131r\u0131n | S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, TypeScript'in '?' operat\u00f6r\u00fcn\u00fcn getirdi\u011fi kolayl\u0131\u011f\u0131n ard\u0131nda yatan potansiyel tuzaklar\u0131 ve bunun yerine <code>Omit<\/code> utility tipini kullanarak nas\u0131l daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod yazabilece\u011fimizi ayr\u0131nt\u0131l\u0131 olarak inceledik. G\u00f6rd\u00fck ki, '?' i\u015fareti baz\u0131 durumlarda pratik olsa da, \u00f6zellikle karma\u015f\u0131k uygulamalarda ve b\u00fcy\u00fck veri modellerinde belirsizli\u011fe, runtime hatalar\u0131na ve gereksiz g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilir.<\/p>\n<p><code>Omit<\/code>, bu sorunlara zarif ve tip g\u00fcvenli bir \u00e7\u00f6z\u00fcm sunar. Bir tipten belirli \u00f6zellikleri a\u00e7\u0131k\u00e7a \u00e7\u0131kararak, ilgili ba\u011flam i\u00e7in tam olarak gerekli olan veri yap\u0131s\u0131n\u0131 tan\u0131mlamam\u0131z\u0131 sa\u011flar. Bu sayede:<\/p>\n<ul>\n<li>Yanl\u0131\u015fl\u0131kla hassas bilgilerin if\u015fa edilmesini \u00f6nleriz.<\/li>\n<li>Gereksiz <code>undefined<\/code> kontrollerinden ka\u00e7\u0131narak kodun okunabilirli\u011fini art\u0131r\u0131r\u0131z.<\/li>\n<li>API'ler ve farkl\u0131 uygulama katmanlar\u0131 aras\u0131ndaki veri ak\u0131\u015f\u0131n\u0131 daha net ve g\u00fcvenli hale getiririz.<\/li>\n<li>Kod taban\u0131m\u0131zda \"Don't Repeat Yourself\" (DRY) prensibini benimseyerek, manuel tip tan\u0131mlama hatalar\u0131n\u0131 azalt\u0131r\u0131z.<\/li>\n<\/ul>\n<p><code>Omit<\/code>'i <code>Partial<\/code>, <code>Required<\/code> ve <code>Pick<\/code> gibi di\u011fer utility tipleriyle birle\u015ftirerek, en karma\u015f\u0131k senaryolar i\u00e7in bile \u00f6zelle\u015ftirilmi\u015f ve sa\u011flam tipler olu\u015fturabilece\u011fimizi g\u00f6rd\u00fck. Mevcut projenizdeki '?' kullan\u0131mlar\u0131n\u0131 <code>Omit<\/code> ile refactor etmek, ba\u015flang\u0131\u00e7ta bir \u00e7aba gerektirse de, uzun vadede projenizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini, kalitesini ve geli\u015ftirici verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<p>Unutmay\u0131n, TypeScript'in amac\u0131 sadece JavaScript'e tipler eklemek de\u011fil, ayn\u0131 zamanda geli\u015ftirme s\u00fcrecini daha keyifli, g\u00fcvenli ve verimli hale getirmektir. Utility tipleri, bu amaca ula\u015fmam\u0131z i\u00e7in bize verilen g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. \u015eimdi, kendi projelerinizde '?' i\u015faretini sorgulama ve <code>Omit<\/code>'in g\u00fcc\u00fcn\u00fc ke\u015ffetme zaman\u0131!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Soru 1: Omit sadece basit objelerle mi \u00e7al\u0131\u015f\u0131r?<\/h4>\n<p><strong>Cevap 1:<\/strong> Hay\u0131r, <code>Omit<\/code> sadece basit objelerle s\u0131n\u0131rl\u0131 de\u011fildir. TypeScript'in tip sistemi i\u00e7inde tan\u0131mlanm\u0131\u015f herhangi bir interface veya type alias ile kullan\u0131labilir. Bu, i\u00e7 i\u00e7e ge\u00e7mi\u015f objeler, s\u0131n\u0131flar veya di\u011fer karma\u015f\u0131k veri yap\u0131lar\u0131 \u00fczerinde de <code>Omit<\/code> uygulayabilece\u011finiz anlam\u0131na gelir. Ancak, i\u00e7 i\u00e7e objelerdeki alt \u00f6zelliklerini do\u011frudan \u00e7\u0131karmak i\u00e7in <code>Omit<\/code> tek ba\u015f\u0131na yeterli olmayabilir; bu durumlarda \u00f6zel tipler veya rek\u00fcrsif utility tipleri olu\u015fturman\u0131z gerekebilir.<\/p>\n<h4>Soru 2: Omit performans\u0131 etkiler mi?<\/h4>\n<p><strong>Cevap 2:<\/strong> Hay\u0131r, <code>Omit<\/code> bir compile-time (derleme zaman\u0131) \u00f6zelli\u011fidir. TypeScript kodu derledi\u011finde, <code>Omit<\/code> taraf\u0131ndan olu\u015fturulan tipler sadece derleyici taraf\u0131ndan tip denetimi i\u00e7in kullan\u0131l\u0131r. \u00c7al\u0131\u015fma zaman\u0131nda (runtime) JavaScript kodunda <code>Omit<\/code>'in hi\u00e7bir etkisi yoktur. Dolay\u0131s\u0131yla, uygulaman\u0131z\u0131n runtime performans\u0131n\u0131 do\u011frudan etkilemez. Performans \u00fczerindeki etkisi tamamen TypeScript derleyicisinin derleme s\u00fcresine yans\u0131r ki bu da genellikle g\u00f6z ard\u0131 edilebilir d\u00fczeydedir.<\/p>\n<h4>Soru 3: Ne zaman Omit yerine Pick kullanmal\u0131y\u0131m?<\/h4>\n<p><strong>Cevap 3:<\/strong> Genel bir kural olarak, yeni tipinizin orijinal tipin \u00f6zelliklerinin \u00e7ok k\u00fc\u00e7\u00fck bir alt k\u00fcmesini i\u00e7ermesini istiyorsan\u0131z <code>Pick<\/code> kullanmal\u0131s\u0131n\u0131z (beyaz liste yakla\u015f\u0131m\u0131). \u00d6rne\u011fin, 10 \u00f6zellikli bir objeden sadece 2 \u00f6zelli\u011fe ihtiyac\u0131n\u0131z varsa <code>Pick<\/code> daha okunabilir olacakt\u0131r. E\u011fer orijinal tipin hemen hemen t\u00fcm \u00f6zelliklerine ihtiyac\u0131n\u0131z var ve sadece birka\u00e7\u0131n\u0131 hari\u00e7 tutmak istiyorsan\u0131z <code>Omit<\/code> kullanmak daha pratiktir (kara liste yakla\u015f\u0131m\u0131).<\/p>\n<h4>Soru 4: Omit ve Partial birlikte nas\u0131l kullan\u0131l\u0131r?<\/h4>\n<p><strong>Cevap 4:<\/strong> <code>Omit<\/code> ve <code>Partial<\/code>'\u0131 birle\u015ftirerek, belirli alanlar\u0131 bir tipten \u00e7\u0131karabilir, ard\u0131ndan kalan alanlar\u0131n tamam\u0131n\u0131 veya bir k\u0131sm\u0131n\u0131 opsiyonel hale getirebilirsiniz. Yayg\u0131n kullan\u0131m senaryosu, bir API'ye veri g\u00f6nderirken (\u00f6rne\u011fin g\u00fcncelleme i\u015flemi), <code>id<\/code> gibi de\u011fi\u015fmeyen alanlar\u0131 \u00e7\u0131kar\u0131p, kalan t\u00fcm alanlar\u0131 opsiyonel yapmak veya sadece belirli alanlar\u0131 opsiyonel b\u0131rakmakt\u0131r. \u00d6rne\u011fin: <code>type KullaniciGuncelleme = Partial<Omit<Kullanici, \"id\" | \"createdAt\">>;<\/code> Bu, <code>id<\/code> ve <code>createdAt<\/code> hari\u00e7, <code>Kullanici<\/code> tipindeki t\u00fcm alanlar\u0131 opsiyonel yapar.<\/p>\n<h4>Soru 5: Omit eski TypeScript versiyonlar\u0131nda destekleniyor mu?<\/h4>\n<p><strong>Cevap 5:<\/strong> <code>Omit<\/code> utility tipi, TypeScript 3.5 s\u00fcr\u00fcm\u00fcnden itibaren standart olarak k\u00fct\u00fcphaneye dahil edilmi\u015ftir. E\u011fer projeniz daha eski bir TypeScript s\u00fcr\u00fcm\u00fc kullan\u0131yorsa (ki bu pek olas\u0131 de\u011fil, \u00e7\u00fcnk\u00fc modern projelerde g\u00fcncel s\u00fcr\u00fcmler tercih edilir), bu tipi manuel olarak tan\u0131mlaman\u0131z gerekebilir. Ancak g\u00fcncel projelerin \u00e7o\u011fu zaten TypeScript 3.5 ve \u00fczeri s\u00fcr\u00fcmleri kulland\u0131\u011f\u0131 i\u00e7in <code>Omit<\/code>'i do\u011frudan kullanabilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z &#8216;?&#8217; i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor&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-35403","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 &#039;?&#039; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n<\/title>\n<meta name=\"description\" content=\"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z &#039;?&#039; i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, &#039;?&#039; kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript&#039;in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.\" \/>\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-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TypeScript&#039;te &#039;?&#039; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n\" \/>\n<meta property=\"og:description\" content=\"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z &#039;?&#039; i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, &#039;?&#039; kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript&#039;in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T05:31:10+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=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"TypeScript&#8217;te &#8216;?&#8217; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n\",\"datePublished\":\"2025-11-29T05:31:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\"},\"wordCount\":4264,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\",\"name\":\"TypeScript'te '?' Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-29T05:31:10+00:00\",\"description\":\"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z '?' i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, '?' kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript'in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TypeScript&#8217;te &#8216;?&#8217; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n\"}]},{\"@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 '?' Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n","description":"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z '?' i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, '?' kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript'in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.","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-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/","og_locale":"tr_TR","og_type":"article","og_title":"TypeScript'te '?' Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n","og_description":"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z '?' i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, '?' kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript'in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.","og_url":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-29T05:31:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"TypeScript&#8217;te &#8216;?&#8217; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n","datePublished":"2025-11-29T05:31:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/"},"wordCount":4264,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/","url":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/","name":"TypeScript'te '?' Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-29T05:31:10+00:00","description":"TypeScript projelerinizde opsiyonel \u00f6zellikler i\u00e7in s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z '?' i\u015faretinin, zamanla beklenmedik hatalara ve karma\u015f\u0131k kodlara yol a\u00e7abilece\u011fini biliyor muydunuz? Bu makalede, '?' kullan\u0131m\u0131n\u0131n neden riskli olabilece\u011fini derinlemesine inceleyecek, TypeScript'in g\u00fc\u00e7l\u00fc Utility Tiplerinden biri olan Omit ile daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay kod nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Gelin, tip g\u00fcvenli\u011fini bir sonraki seviyeye ta\u015f\u0131yarak geli\u015ftirici deneyiminizi nas\u0131l iyile\u015ftirebilece\u011finizi ke\u015ffedelim.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/typescriptte-kullanimina-son-omit-ile-daha-guvenli-kod-yazin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TypeScript&#8217;te &#8216;?&#8217; Kullan\u0131m\u0131na Son! Omit ile Daha G\u00fcvenli Kod Yaz\u0131n"}]},{"@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\/35403","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=35403"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35403\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}