{"id":36716,"date":"2025-12-22T01:41:00","date_gmt":"2025-12-21T22:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36716"},"modified":"2025-12-22T01:41:00","modified_gmt":"2025-12-21T22:41:00","slug":"vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/","title":{"rendered":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi<\/h2>\n<p>Vue.js, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in a\u015famal\u0131 olarak benimsenebilen pop\u00fcler bir JavaScript \u00e7er\u00e7evesidir. Geleneksel olarak, Vue bile\u015fenleri Options API (se\u00e7enekler API&#8217;si) kullan\u0131larak tan\u0131mlan\u0131r; bu yakla\u015f\u0131m, bile\u015fenin veri, metotlar, hesaplanm\u0131\u015f \u00f6zellikler ve ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131n\u0131 ayr\u0131 ayr\u0131 nesne \u00f6zellikleri olarak d\u00fczenler. Vue 3 ile birlikte tan\u0131t\u0131lan Composition API (bile\u015fim API&#8217;si) ise, daha esnek ve yeniden kullan\u0131labilir mant\u0131k organizasyonu sa\u011flayarak geli\u015ftiricilere farkl\u0131 bir alternatif sunmu\u015ftur. Ancak, \u00f6zellikle C#, Java, Angular veya React&#8217;\u0131n s\u0131n\u0131f tabanl\u0131 bile\u015fen yakla\u015f\u0131mlar\u0131ndan gelen geli\u015ftiriciler i\u00e7in, nesne y\u00f6nelimli programlama (OOP) ilkelerine daha yak\u0131n bir yol olan s\u0131n\u0131f tabanl\u0131 bile\u015fenler yazmak cazip olabilir.<\/p>\n<p>Bu makale, Vue.js projelerinizde TypeScript&#8217;in g\u00fc\u00e7l\u00fc tip sistemiyle birlikte s\u0131n\u0131f tabanl\u0131 bile\u015fenleri nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ayr\u0131nt\u0131l\u0131 olarak a\u00e7\u0131klayacakt\u0131r. <code>vue-class-component<\/code> ve <code>vue-property-decorator<\/code> gibi yard\u0131mc\u0131 k\u00fct\u00fcphaneler arac\u0131l\u0131\u011f\u0131yla, tan\u0131d\u0131k bir s\u0131n\u0131f yap\u0131s\u0131 i\u00e7inde Vue&#8217;nun reaktifli\u011fini ve bile\u015fen \u00f6zelliklerini nas\u0131l y\u00f6netece\u011finizi \u00f6\u011freneceksiniz. Bu yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k bile\u015fenlerde kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve tip g\u00fcvenli\u011fini art\u0131rman\u0131za yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Neden S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler?<\/h3>\n<p>Vue&#8217;nun Options API&#8217;si ve Composition API&#8217;si \u00e7o\u011fu senaryo i\u00e7in harika \u00e7\u00f6z\u00fcmler sunsa da, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin kendine \u00f6zg\u00fc avantajlar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>OOP Geli\u015ftiricileri \u0130\u00e7in Tan\u0131d\u0131kl\u0131k:<\/strong> Nesne y\u00f6nelimli programlama ge\u00e7mi\u015fi olan geli\u015ftiriciler (\u00f6rne\u011fin C#, Java, Angular veya React s\u0131n\u0131f bile\u015fenleri), <code>class<\/code> anahtar kelimesi, kal\u0131t\u0131m ve metod tan\u0131mlamalar\u0131 gibi kavramlara a\u015finad\u0131r. S\u0131n\u0131f tabanl\u0131 bile\u015fenler, bu geli\u015ftiricilerin Vue ekosistemine daha h\u0131zl\u0131 adapte olmalar\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>TypeScript ile G\u00fc\u00e7l\u00fc Tip Deste\u011fi:<\/strong> TypeScript, JavaScript&#8217;e tip g\u00fcvenli\u011fi getiren bir \u00fcst k\u00fcmedir. S\u0131n\u0131f tabanl\u0131 bile\u015fenler, TypeScript&#8217;in sundu\u011fu g\u00fc\u00e7l\u00fc tip denetimi ve otomatik tamamlama \u00f6zelliklerini do\u011fal bir \u015fekilde entegre eder. S\u0131n\u0131f \u00f6zellikleri do\u011frudan tiplendirilebilir, bu da geli\u015ftirme s\u00fcrecinde hatalar\u0131 erken yakalamaya ve daha sa\u011flam kod yazmaya yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Daha \u0130yi Kod Organizasyonu:<\/strong> S\u0131n\u0131flar, ilgili veri, metotlar ve ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131n\u0131 tek bir yap\u0131da gruplamak i\u00e7in do\u011fal bir mekanizma sunar. Bu, \u00f6zellikle b\u00fcy\u00fck bile\u015fenlerde kodun daha d\u00fczenli ve anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flayabilir.<br \/>\n*   <strong>Kal\u0131t\u0131m ve Mixin Potansiyeli:<\/strong> S\u0131n\u0131f yap\u0131s\u0131, bile\u015fenler aras\u0131nda kal\u0131t\u0131m veya mixin&#8217;ler (kar\u0131\u015f\u0131mlar) arac\u0131l\u0131\u011f\u0131yla ortak mant\u0131\u011f\u0131 payla\u015fma imkan\u0131 sunar. Bu, kod tekrar\u0131n\u0131 azaltmaya ve yeniden kullan\u0131labilirli\u011fi art\u0131rmaya yard\u0131mc\u0131 olabilir. Ancak, Vue 3&#8217;\u00fcn Composition API&#8217;si genellikle bu t\u00fcr yeniden kullan\u0131labilir mant\u0131k i\u00e7in daha modern ve esnek bir yakla\u015f\u0131m olarak kabul edilir.<br \/>\n*   <strong>Dekorat\u00f6rlerin G\u00fcc\u00fc:<\/strong> <code>vue-property-decorator<\/code> gibi k\u00fct\u00fcphaneler, <code>@Prop<\/code>, <code>@Watch<\/code>, <code>@Emit<\/code> gibi dekorat\u00f6rler kullanarak Vue&#8217;ya \u00f6zg\u00fc \u00f6zellikleri (prop&#8217;lar, izleyiciler, olaylar) s\u0131n\u0131f \u00f6zelliklerine ve metotlar\u0131na do\u011frudan eklemeyi m\u00fcmk\u00fcn k\u0131lar. Bu, kodun daha deklaratif ve \u00f6zl\u00fc olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu avantajlar, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda veya belirli geli\u015ftirici tercihleri olan ekiplerde s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin tercih edilmesine yol a\u00e7abilir.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu makaledeki \u00f6rnekleri takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki temel bilgilere ve ara\u00e7lara sahip olman\u0131z gerekmektedir:<\/p>\n<p>*   <strong>Temel Vue.js Bilgisi:<\/strong> Vue bile\u015fenlerinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair genel bir anlay\u0131\u015f.<br \/>\n*   <strong>Temel TypeScript Bilgisi:<\/strong> Tipler, aray\u00fczler ve s\u0131n\u0131flar gibi temel TypeScript kavramlar\u0131na a\u015final\u0131k.<br \/>\n*   <strong>Node.js ve npm\/yarn:<\/strong> Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek ve geli\u015ftirme sunucusunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereklidir.<br \/>\n*   <strong>Vue CLI veya Vite:<\/strong> Vue projeleri olu\u015fturmak ve y\u00f6netmek i\u00e7in kullan\u0131lan komut sat\u0131r\u0131 ara\u00e7lar\u0131. Bu makalede hem Vue CLI hem de Vite ile kurulum ad\u0131mlar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>Projenizi Kurma<\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenleri kullanmak i\u00e7in projenizi do\u011fru \u015fekilde yap\u0131land\u0131rman\u0131z gerekir. Hem Vue CLI hem de Vite ile nas\u0131l yapaca\u011f\u0131n\u0131z\u0131 g\u00f6relim.<\/p>\n<h4>Vue CLI ile Kurulum (\u00d6nerilen)<\/h4>\n<p>Vue CLI, s\u0131n\u0131f tabanl\u0131 bile\u015fenler i\u00e7in gerekli t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve yap\u0131land\u0131rmay\u0131 otomatik olarak ekleyen bir se\u00e7ene\u011fe sahiptir.<\/p>\n<p>1.  <strong>Vue CLI&#8217;\u0131 Y\u00fckleyin:<\/strong> Hen\u00fcz y\u00fckl\u00fc de\u011filse, global olarak Vue CLI&#8217;\u0131 kurun:<\/p>\n<pre><code class=\"language-bash\">npm install -g @vue\/cli\n    # veya\n    yarn global add @vue\/cli<\/code><\/pre>\n<p>2.  <strong>Yeni Bir Proje Olu\u015fturun:<\/strong><\/p>\n<pre><code class=\"language-bash\">vue create my-class-component-project<\/code><\/pre>\n<p>3.  <strong>\u00d6zellikleri Manuel Olarak Se\u00e7in:<\/strong> Komut sat\u0131r\u0131 isteminde &#8220;Manually select features&#8221; (\u00d6zellikleri manuel olarak se\u00e7) se\u00e7ene\u011fini i\u015faretleyin.<br \/>\n4.  <strong>Gerekli \u00d6zellikleri Se\u00e7in:<\/strong> En az\u0131ndan a\u015fa\u011f\u0131daki se\u00e7enekleri se\u00e7ti\u011finizden emin olun (bo\u015fluk tu\u015fu ile se\u00e7ilir, Enter ile devam edilir):<br \/>\n    *   <code>TypeScript<\/code><br \/>\n    *   <code>Class-style Component Syntax<\/code><br \/>\n    *   Di\u011fer ihtiya\u00e7lar\u0131n\u0131za g\u00f6re Router, Vuex, Linter\/Formatter gibi se\u00e7enekleri de ekleyebilirsiniz.<br \/>\n5.  <strong>Vue S\u00fcr\u00fcm\u00fcn\u00fc Se\u00e7in:<\/strong> Vue 3&#8217;\u00fc se\u00e7meniz \u00f6nerilir.<br \/>\n6.  <strong>Di\u011fer Yap\u0131land\u0131rmalar\u0131 Tamamlay\u0131n:<\/strong> Babel, ESLint, paket y\u00f6neticisi gibi di\u011fer sorular\u0131 kendi tercihlerinize g\u00f6re yan\u0131tlay\u0131n.<\/p>\n<p>Vue CLI, projenizi olu\u015fturduktan sonra <code>tsconfig.json<\/code>, <code>shims-vue.d.ts<\/code> dosyalar\u0131n\u0131 ve <code>main.ts<\/code> i\u00e7inde s\u0131n\u0131f tabanl\u0131 bile\u015fenleri destekleyecek \u015fekilde gerekli yap\u0131land\u0131rmay\u0131 otomatik olarak ekleyecektir. Ayr\u0131ca <code>vue-class-component<\/code> ve <code>vue-property-decorator<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 da kuracakt\u0131r.<\/p>\n<h4>Vite ile Kurulum (Modern Alternatif)<\/h4>\n<p>Vite, daha h\u0131zl\u0131 geli\u015ftirme deneyimi sunan modern bir yap\u0131 arac\u0131d\u0131r. Vite ile s\u0131n\u0131f tabanl\u0131 bile\u015fenleri kullanmak i\u00e7in baz\u0131 manuel ad\u0131mlar gereklidir.<\/p>\n<p>1.  <strong>Yeni Bir Vite Projesi Olu\u015fturun:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm init vue@latest<\/code><\/pre>\n<p>2.  <strong>Proje Ad\u0131n\u0131 ve Se\u00e7enekleri Belirleyin:<\/strong> Proje ad\u0131n\u0131z\u0131 girin ve istemlerde <code>TypeScript<\/code> se\u00e7ene\u011fini <code>Yes<\/code> olarak i\u015faretleyin. Di\u011fer se\u00e7enekleri (JSX, Router, Pinia, Vitest, ESLint) kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re belirleyebilirsiniz.<br \/>\n3.  <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurun:<\/strong> Proje dizinine gidin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurun:<\/p>\n<pre><code class=\"language-bash\">cd my-class-component-project\n    npm install<\/code><\/pre>\n<p>4.  <strong>Gerekli K\u00fct\u00fcphaneleri Y\u00fckleyin:<\/strong> S\u0131n\u0131f tabanl\u0131 bile\u015fenleri etkinle\u015ftirmek i\u00e7in <code>vue-class-component<\/code> ve <code>vue-property-decorator<\/code>&#8216;\u0131 kurman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install vue-class-component vue-property-decorator<\/code><\/pre>\n<p>    <strong>Vue 3 i\u00e7in dikkat:<\/strong> <code>vue-class-component<\/code>&#8216;\u0131n 8.x s\u00fcr\u00fcm\u00fc Vue 3 ile uyumludur. Y\u00fckledi\u011finizden emin olun.<br \/>\n5.  <strong><code>main.ts<\/code> Dosyas\u0131n\u0131 G\u00fcncelleyin:<\/strong> Vue uygulaman\u0131z\u0131 olu\u015fturan <code>main.ts<\/code> dosyas\u0131nda \u00f6zel bir yap\u0131land\u0131rma genellikle gerekmez. Ancak, bile\u015fenlerinizi s\u0131n\u0131f tabanl\u0131 yazmaya ba\u015flayabilirsiniz.<br \/>\n6.  <strong><code>tsconfig.json<\/code> Dosyas\u0131n\u0131 Kontrol Edin:<\/strong> Dekorat\u00f6rleri kullanabilmek i\u00e7in <code>tsconfig.json<\/code> dosyas\u0131nda <code>experimentalDecorators<\/code> ve <code>emitDecoratorMetadata<\/code> se\u00e7eneklerinin <code>true<\/code> olarak ayarland\u0131\u011f\u0131ndan emin olun.<\/p>\n<pre><code class=\"language-json\">{\n      \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"module\": \"esnext\",\n        \"strict\": true,\n        \"jsx\": \"preserve\",\n        \"importHelpers\": true,\n        \"moduleResolution\": \"node\",\n        \"skipLibCheck\": true,\n        \"esModuleInterop\": true,\n        \"allowSyntheticDefaultImports\": true,\n        \"sourceMap\": true,\n        \"baseUrl\": \".\",\n        \"types\": [\n          \"webpack-env\"\n        ],\n        \"paths\": {\n          \"@\/*\": [\n            \"src\/*\"\n          ]\n        },\n        \"lib\": [\n          \"esnext\",\n          \"dom\",\n          \"dom.iterable\",\n          \"scripthost\"\n        ],\n        \"experimentalDecorators\": true, \/\/ Bu sat\u0131r \u00f6nemli\n        \"emitDecoratorMetadata\": true \/\/ Bu sat\u0131r da \u00f6nemli\n      },\n      \"include\": [\n        \"src\/<em><\/em>\/*.ts\",\n        \"src\/<em><\/em>\/*.tsx\",\n        \"src\/<em><\/em>\/*.vue\",\n        \"tests\/<em><\/em>\/*.ts\",\n        \"tests\/<em><\/em>\/*.tsx\"\n      ],\n      \"exclude\": [\n        \"node_modules\"\n      ]\n    }<\/code><\/pre>\n<p>Her iki kurulum y\u00f6nteminde de temel ama\u00e7, TypeScript&#8217;in dekorat\u00f6rleri tan\u0131mas\u0131n\u0131 sa\u011flamak ve <code>vue-class-component<\/code> ile <code>vue-property-decorator<\/code> k\u00fct\u00fcphanelerini projenize dahil etmektir.<\/p>\n<h3>Temel K\u00fct\u00fcphaneler: <code>vue-class-component<\/code> ve <code>vue-property-decorator<\/code><\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 Vue bile\u015fenlerinin arkas\u0131ndaki iki ana k\u00fct\u00fcphane \u015funlard\u0131r:<\/p>\n<p>1.  <strong><code>vue-class-component<\/code><\/strong>: Bu, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin temelini olu\u015fturan k\u00fct\u00fcphanedir. JavaScript s\u0131n\u0131flar\u0131n\u0131 Vue bile\u015fenlerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Vue 2 i\u00e7in <code>Component<\/code> dekorat\u00f6r\u00fcn\u00fc, Vue 3 i\u00e7in ise <code>Options<\/code> dekorat\u00f6r\u00fcn\u00fc sa\u011flar. Bir s\u0131n\u0131f\u0131 Vue bile\u015feni olarak tan\u0131mlamak i\u00e7in bu dekorat\u00f6r\u00fc kullan\u0131r\u0131z.<\/p>\n<pre><code class=\"language-typescript\">\/\/ Vue 2 i\u00e7in:\n    import Component from 'vue-class-component';\n    @Component\n    export default class MyComponent extends Vue { \/<em> ... <\/em>\/ }\n\n    \/\/ Vue 3 i\u00e7in:\n    import { Options, Vue } from 'vue-class-component';\n    @Options({}) \/\/ Bile\u015fen se\u00e7enekleri burada tan\u0131mlan\u0131r\n    export default class MyComponent extends Vue { \/<em> ... <\/em>\/ }<\/code><\/pre>\n<p>    Vue 3&#8217;te <code>Options<\/code> dekorat\u00f6r\u00fc, Options API&#8217;sindeki <code>components<\/code>, <code>directives<\/code>, <code>mixins<\/code> gibi \u00f6zellikleri tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>2.  <strong><code>vue-property-decorator<\/code><\/strong>: Bu k\u00fct\u00fcphane, <code>vue-class-component<\/code> \u00fczerine in\u015fa edilmi\u015ftir ve Vue&#8217;ya \u00f6zg\u00fc \u00f6zellikleri (prop&#8217;lar, izleyiciler, olaylar vb.) s\u0131n\u0131f \u00f6zellikleri ve metotlar\u0131 \u00fczerinde dekorat\u00f6rler arac\u0131l\u0131\u011f\u0131yla tan\u0131mlamam\u0131z\u0131 sa\u011flar. Bu, kodu daha temiz ve okunakl\u0131 hale getirir.<br \/>\n    *   <code>@Prop<\/code>: Bile\u015fene d\u0131\u015far\u0131dan veri ge\u00e7irmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@Emit<\/code>: Bile\u015fenden d\u0131\u015far\u0131ya olay f\u0131rlatmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@Watch<\/code>: Bir veri \u00f6zelli\u011finin de\u011fi\u015fimini izlemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@Model<\/code>: <code>v-model<\/code> ile \u00e7ift y\u00f6nl\u00fc veri ba\u011flamay\u0131 etkinle\u015ftirmek i\u00e7in kullan\u0131l\u0131r (Vue 3&#8217;te <code>@Model<\/code> yerine <code>v-model<\/code> prop&#8217;lar\u0131 do\u011frudan kullan\u0131l\u0131r).<br \/>\n    *   <code>@Provide<\/code>, <code>@Inject<\/code>: \u00dcst ve alt bile\u015fenler aras\u0131nda uzun mesafeli veri ileti\u015fimi i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@Mixins<\/code>: Bir veya daha fazla mixin&#8217;i bile\u015fene dahil etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Bu iki k\u00fct\u00fcphane birlikte, Vue&#8217;nun reaktif sistemini ve bile\u015fen mimarisini TypeScript s\u0131n\u0131flar\u0131 i\u00e7inde tam olarak kullanmam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>\u0130lk S\u0131n\u0131f Tabanl\u0131 Bile\u015feninizi Olu\u015fturma<\/h3>\n<p>\u015eimdi temel bir s\u0131n\u0131f tabanl\u0131 Vue bile\u015feni olu\u015ftural\u0131m. <code>src\/components\/HelloWorld.vue<\/code> dosyas\u0131n\u0131 d\u00fc\u015f\u00fcnelim.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div class=\"hello\">\n    \n    <p>Mesaj\u0131n Ters Hali: {{ reversedMessage }}<\/p>\n    <button @click=\"greet\">Selamla<\/button>\n    <ChildComponent :title=\"message\" :count=\"10\" @custom-event=\"handleChildEvent\" \/>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component'; \/\/ Vue 3 i\u00e7in\n\/\/ import Component from 'vue-class-component'; \/\/ Vue 2 i\u00e7in\nimport ChildComponent from '.\/ChildComponent.vue'; \/\/ Ba\u015fka bir bile\u015fen\n\n\/\/ Vue 3'te bile\u015fen se\u00e7enekleri @Options dekorat\u00f6r\u00fc i\u00e7inde tan\u0131mlan\u0131r.\n@Options({\n  components: {\n    ChildComponent,\n  },\n})\nexport default class HelloWorld extends Vue {\n  \/\/ Veri \u00d6zellikleri (Data Properties)\n  \/\/ TypeScript ile do\u011frudan tiplendirilir.\n  message: string = 'Merhaba Vue ve TypeScript!';\n  counter: number = 0;\n\n  \/\/ Hesaplanan \u00d6zellikler (Computed Properties)\n  \/\/ Getter olarak tan\u0131mlan\u0131r.\n  get reversedMessage(): string {\n    return this.message.split('').reverse().join('');\n  }\n\n  \/\/ Metotlar (Methods)\n  greet(): void {\n    alert(this.message);\n  }\n\n  increment(): void {\n    this.counter++;\n  }\n\n  handleChildEvent(payload: string): void {\n    console.log('\u00c7ocuk bile\u015fenden olay al\u0131nd\u0131:', payload);\n    this.message = <code>Olay al\u0131nd\u0131: ${payload}<\/code>;\n  }\n\n  \/\/ Ya\u015fam D\u00f6ng\u00fcs\u00fc Kancalar\u0131 (Lifecycle Hooks)\n  \/\/ Options API'deki gibi do\u011frudan metot olarak tan\u0131mlan\u0131r.\n  created(): void {\n    console.log('HelloWorld bile\u015feni olu\u015fturuldu!');\n  }\n\n  mounted(): void {\n    console.log('HelloWorld bile\u015feni DOM\\'a ba\u011fland\u0131!');\n    this.increment();\n  }\n\n  beforeUnmount(): void {\n    console.log('HelloWorld bile\u015feni DOM\\'dan kald\u0131r\u0131lmadan \u00f6nce.');\n  }\n}\n<\/script>\n\n<style scoped>\n.hello {\n  font-family: Avenir, Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-align: center;\n  color: #2c3e50;\n  margin-top: 60px;\n}\n<\/style><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte dikkat etmemiz gereken noktalar \u015funlard\u0131r:<\/p>\n<p>*   <strong><code>import { Options, Vue } from 'vue-class-component';<\/code><\/strong>: Vue 3 ile s\u0131n\u0131f tabanl\u0131 bile\u015fenler yazarken bu import ifadesini kullan\u0131r\u0131z. <code>Vue<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyerek bile\u015fenimizin temel Vue \u00f6zelliklerini miras almas\u0131n\u0131 sa\u011flar\u0131z. <code>Options<\/code> ise bile\u015fenin Options API&#8217;deki gibi <code>components<\/code>, <code>directives<\/code> gibi \u00f6zelliklerini tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>@Options({ components: { ChildComponent } })<\/code><\/strong>: Bu dekorat\u00f6r, s\u0131n\u0131f\u0131m\u0131z\u0131n bir Vue bile\u015feni oldu\u011funu belirtir. Options API&#8217;deki <code>components<\/code> nesnesi gibi, burada da di\u011fer alt bile\u015fenleri kaydedebiliriz.<br \/>\n*   <strong><code>export default class HelloWorld extends Vue { ... }<\/code><\/strong>: Bile\u015fenimiz, <code>Vue<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen bir TypeScript s\u0131n\u0131f\u0131 olarak tan\u0131mlan\u0131r. Bu, <code>this<\/code> anahtar kelimesi arac\u0131l\u0131\u011f\u0131yla bile\u015fenin t\u00fcm \u00f6zelliklerine ve metotlar\u0131na eri\u015fmemizi sa\u011flar.<br \/>\n*   <strong>Veri \u00d6zellikleri (<code>message<\/code>, <code>counter<\/code>)<\/strong>: Bunlar do\u011frudan s\u0131n\u0131f \u00f6zellikleri olarak tan\u0131mlan\u0131r ve TypeScript ile tiplendirilir. Vue&#8217;nun reaktif sistemi, bu \u00f6zellikleri otomatik olarak izler.<br \/>\n*   <strong>Hesaplanan \u00d6zellikler (<code>reversedMessage<\/code>)<\/strong>: Bunlar, <code>get<\/code> anahtar kelimesi kullan\u0131larak getter metotlar\u0131 olarak tan\u0131mlan\u0131r. TypeScript, d\u00f6n\u00fc\u015f tipini otomatik olarak \u00e7\u0131karabilir veya a\u00e7\u0131k\u00e7a belirtebiliriz (<code>: string<\/code>).<br \/>\n*   <strong>Metotlar (<code>greet<\/code>, <code>increment<\/code>, <code>handleChildEvent<\/code>)<\/strong>: Bunlar, s\u0131n\u0131f metotlar\u0131 olarak tan\u0131mlan\u0131r. Normal JavaScript metotlar\u0131 gibi \u00e7al\u0131\u015f\u0131rlar ve <code>this<\/code> ba\u011flam\u0131 do\u011fru \u015fekilde bile\u015feni i\u015faret eder.<br \/>\n*   <strong>Ya\u015fam D\u00f6ng\u00fcs\u00fc Kancalar\u0131 (<code>created<\/code>, <code>mounted<\/code>, <code>beforeUnmount<\/code>)<\/strong>: Options API&#8217;deki gibi, bu kancalar do\u011frudan s\u0131n\u0131f metotlar\u0131 olarak tan\u0131mlan\u0131r. Herhangi bir \u00f6zel dekorat\u00f6re ihtiya\u00e7 duymazlar.<\/p>\n<p>\u015eimdi <code>ChildComponent.vue<\/code> \u00f6rne\u011fini de ekleyelim, \u00e7\u00fcnk\u00fc yukar\u0131daki <code>HelloWorld<\/code> bile\u015feni onu kullan\u0131yor:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div class=\"child-component\">\n    <h3>\u00c7ocuk Bile\u015fen<\/h3>\n    <p>Ba\u015fl\u0131k: {{ title }}<\/p>\n    <p>Say\u0131: {{ count }}<\/p>\n    <p>\u0130\u00e7erik: {{ content }}<\/p>\n    <button @click=\"emitCustomEvent\">Olay F\u0131rlat<\/button>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\nimport { Prop, Emit } from 'vue-property-decorator'; \/\/ Prop ve Emit dekorat\u00f6rlerini i\u00e7e aktar\u0131yoruz\n\n@Options({})\nexport default class ChildComponent extends Vue {\n  \/\/ Prop'lar\n  \/\/ @Prop dekorat\u00f6r\u00fc ile tan\u0131mlan\u0131r.\n  \/\/ readonly anahtar kelimesi, prop'lar\u0131n bile\u015fen i\u00e7inde de\u011fi\u015ftirilemeyece\u011fini belirtir.\n  \/\/ ! (definite assignment assertion) prop'un mutlaka bir de\u011fer alaca\u011f\u0131n\u0131 TypeScript'e bildirir.\n  @Prop() readonly title!: string;\n  @Prop({ default: 'Varsay\u0131lan \u00c7ocuk \u0130\u00e7eri\u011fi' }) readonly content?: string; \/\/ Opsiyonel prop, varsay\u0131lan de\u011fer ile\n  @Prop({ type: Number, required: true }) readonly count!: number; \/\/ Tip ve zorunluluk belirtme\n\n  \/\/ Olaylar (Emits)\n  \/\/ @Emit dekorat\u00f6r\u00fc ile metotlar olay f\u0131rlatabilir.\n  \/\/ Metot ad\u0131 varsay\u0131lan olarak olay ad\u0131 olur (camelCase'den kebab-case'e d\u00f6n\u00fc\u015f\u00fcr).\n  \/\/ Parametreler olay\u0131n payload'\u0131 olur.\n  @Emit('custom-event') \/\/ \u00d6zel olay ad\u0131 belirttik\n  emitCustomEvent(): string {\n    const payload = '\u00c7ocuktan gelen veri!';\n    console.log('custom-event olay\u0131 f\u0131rlat\u0131ld\u0131:', payload);\n    return payload; \/\/ Bu de\u011fer, olay\u0131n payload'\u0131 olarak g\u00f6nderilir\n  }\n}\n<\/script>\n\n<style scoped>\n.child-component {\n  border: 1px solid #ccc;\n  padding: 15px;\n  margin-top: 20px;\n  background-color: #f9f9f9;\n}\n<\/style><\/code><\/pre>\n<p>Bu <code>ChildComponent<\/code> \u00f6rne\u011fi, <code>@Prop<\/code> ve <code>@Emit<\/code> dekorat\u00f6rlerinin nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6steriyor.<\/p>\n<h3>S\u0131n\u0131f Bile\u015fenlerinde Vue \u00d6zellikleriyle \u00c7al\u0131\u015fma<\/h3>\n<p><code>vue-property-decorator<\/code> k\u00fct\u00fcphanesi, Vue&#8217;nun temel \u00f6zelliklerini s\u0131n\u0131f bile\u015fenlerinizde kullanmak i\u00e7in \u00e7e\u015fitli dekorat\u00f6rler sunar.<\/p>\n<h4>Prop&#8217;lar (<code>@Prop<\/code>)<\/h4>\n<p><code>@Prop<\/code> dekorat\u00f6r\u00fc, bile\u015feninize d\u0131\u015far\u0131dan veri ge\u00e7irmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { Options, Vue } from 'vue-class-component';\nimport { Prop } from 'vue-property-decorator';\n\n@Options({})\nexport default class MyPropComponent extends Vue {\n  \/\/ Basit zorunlu prop\n  @Prop() readonly message!: string;\n\n  \/\/ Varsay\u0131lan de\u011fere sahip opsiyonel prop\n  @Prop({ default: 0 }) readonly initialCount?: number;\n\n  \/\/ Tip ve zorunluluk belirtme\n  @Prop({ type: String, required: true }) readonly userName!: string;\n\n  \/\/ Validator ile prop\n  @Prop({\n    validator: (value: string) => ['admin', 'user', 'guest'].includes(value),\n  })\n  readonly userRole!: string;\n\n  \/\/ Karma\u015f\u0131k tip i\u00e7in aray\u00fcz kullan\u0131m\u0131\n  @Prop() readonly item!: { id: number; name: string };\n\n  mounted() {\n    console.log(this.message, this.initialCount, this.userName, this.userRole, this.item.name);\n  }\n}<\/code><\/pre>\n<p>*   <code>readonly<\/code>: Prop&#8217;lar\u0131n bile\u015fen i\u00e7inde de\u011fi\u015ftirilemez oldu\u011funu belirtmek iyi bir pratiktir.<br \/>\n*   <code>!<\/code>: TypeScript&#8217;e bu prop&#8217;un \u00e7al\u0131\u015fma zaman\u0131nda mutlaka bir de\u011fere sahip olaca\u011f\u0131n\u0131 bildirir (definite assignment assertion).<br \/>\n*   <code>?<\/code>: Prop&#8217;un opsiyonel oldu\u011funu belirtir. <code>@Prop({ default: ... })<\/code> ile birlikte kullan\u0131l\u0131r.<\/p>\n<h4>Olaylar (<code>@Emit<\/code>)<\/h4>\n<p><code>@Emit<\/code> dekorat\u00f6r\u00fc, bile\u015feninizden d\u0131\u015far\u0131ya \u00f6zel olaylar f\u0131rlatmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { Options, Vue } from 'vue-class-component';\nimport { Emit } from 'vue-property-decorator';\n\n@Options({})\nexport default class MyEmitterComponent extends Vue {\n  value: string = 'Varsay\u0131lan De\u011fer';\n\n  \/\/ Metot ad\u0131 varsay\u0131lan olay ad\u0131 olur (camelCase'den kebab-case'e d\u00f6n\u00fc\u015f\u00fcr: 'update-value')\n  @Emit()\n  updateValue(newValue: string): void {\n    this.value = newValue;\n    \/\/ Metodun d\u00f6n\u00fc\u015f de\u011feri olay\u0131n payload'\u0131 olur.\n    \/\/ E\u011fer void d\u00f6nd\u00fcr\u00fcl\u00fcrse, payload olmaz veya manuel olarak f\u0131rlat\u0131l\u0131r.\n  }\n\n  \/\/ \u00d6zel bir olay ad\u0131 belirtme\n  @Emit('custom-submit')\n  submitForm(formData: { name: string; email: string }): { name: string; email: string } {\n    console.log('Form g\u00f6nderildi:', formData);\n    return formData; \/\/ formData, 'custom-submit' olay\u0131n\u0131n payload'\u0131 olur\n  }\n\n  handleClick(): void {\n    this.updateValue('Yeni De\u011fer');\n  }\n\n  handleFormSubmit(): void {\n    this.submitForm({ name: 'Ali', email: 'ali@example.com' });\n  }\n}<\/code><\/pre>\n<p>*   E\u011fer <code>@Emit<\/code> dekorat\u00f6r\u00fcne bir arg\u00fcman ge\u00e7mezseniz, metot ad\u0131n\u0131n <code>kebab-case<\/code> versiyonu olay ad\u0131 olarak kullan\u0131l\u0131r (\u00f6rn. <code>updateValue<\/code> -> <code>update-value<\/code>).<br \/>\n*   Metodun d\u00f6n\u00fc\u015f de\u011feri, f\u0131rlat\u0131lan olay\u0131n payload&#8217;\u0131 olarak g\u00f6nderilir.<\/p>\n<h4>\u0130zleyiciler (<code>@Watch<\/code>)<\/h4>\n<p><code>@Watch<\/code> dekorat\u00f6r\u00fc, bir veri \u00f6zelli\u011finin veya hesaplanm\u0131\u015f \u00f6zelli\u011fin de\u011fi\u015fimini izlemek ve belirli bir metodu tetiklemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { Options, Vue } from 'vue-class-component';\nimport { Watch } from 'vue-property-decorator';\n\n@Options({})\nexport default class MyWatcherComponent extends Vue {\n  firstName: string = 'John';\n  lastName: string = 'Doe';\n  fullName: string = ''; \/\/ fullName'i izlemek i\u00e7in\n\n  \/\/ Basit bir veri \u00f6zelli\u011fini izleme\n  @Watch('firstName')\n  onFirstNameChanged(newValue: string, oldValue: string): void {\n    console.log(<code>firstName de\u011fi\u015fti: ${oldValue} -> ${newValue}<\/code>);\n  }\n\n  \/\/ Se\u00e7eneklerle birlikte izleme (immediate, deep)\n  @Watch('lastName', { immediate: true, deep: false })\n  onLastNameChanged(newValue: string, oldValue: string): void {\n    console.log(<code>lastName de\u011fi\u015fti (immediate): ${oldValue} -> ${newValue}<\/code>);\n  }\n\n  \/\/ Birden fazla \u00f6zelli\u011fi izlemek i\u00e7in getter kullanma veya birden fazla @Watch\n  \/\/ Genellikle tek bir \u00f6zelli\u011fi izlemek daha yayg\u0131nd\u0131r.\n  \/\/ Ancak karma\u015f\u0131k nesnelerde deep watch veya birden fazla watch kullan\u0131labilir.\n\n  \/\/ Hesaplanan bir \u00f6zelli\u011fi izleme (fullName'i g\u00fcncel tutmak i\u00e7in)\n  get currentFullName(): string {\n    return <code>${this.firstName} ${this.lastName}<\/code>;\n  }\n\n  @Watch('currentFullName')\n  onFullNameChanged(newValue: string, oldValue: string): void {\n    this.fullName = newValue;\n    console.log(<code>Tam isim de\u011fi\u015fti: ${oldValue} -> ${newValue}<\/code>);\n  }\n\n  mounted() {\n    this.fullName = this.currentFullName; \/\/ Ba\u015flang\u0131\u00e7ta fullName'i ayarla\n    setTimeout(() => {\n      this.firstName = 'Jane'; \/\/ firstName de\u011fi\u015fince onFirstNameChanged tetiklenir\n    }, 1000);\n    setTimeout(() => {\n      this.lastName = 'Smith'; \/\/ lastName de\u011fi\u015fince onLastNameChanged tetiklenir\n    }, 2000);\n  }\n}<\/code><\/pre>\n<p>*   <code>@Watch('propertyName')<\/code>: \u0130zlenecek \u00f6zelli\u011fin ad\u0131n\u0131 dize olarak belirtirsiniz.<br \/>\n*   \u0130zleyici metodu, <code>newValue<\/code> ve <code>oldValue<\/code> olmak \u00fczere iki arg\u00fcman al\u0131r.<br \/>\n*   <code>{ immediate: true }<\/code>: Bile\u015fen olu\u015fturuldu\u011funda izleyici metodunu hemen bir kez \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <code>{ deep: true }<\/code>: \u0130zlenen nesnenin veya dizinin i\u00e7indeki de\u011fi\u015fiklikleri de izler. Performans etkisi olabilece\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h4>Sa\u011flama\/Enjekte Etme (<code>@Provide<\/code>, <code>@Inject<\/code>)<\/h4>\n<p><code>@Provide<\/code> ve <code>@Inject<\/code> dekorat\u00f6rleri, \u00fcst ve alt bile\u015fenler aras\u0131nda, bile\u015fen hiyerar\u015fisinin derinliklerinden ba\u011f\u0131ms\u0131z olarak veri ileti\u015fimi sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Bu, prop ge\u00e7i\u015finin (prop drilling) hantal hale geldi\u011fi durumlarda faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ ParentComponent.vue\n<template>\n  <div>\n    <h2>\u00dcst Bile\u015fen<\/h2>\n    <p>Tema: {{ theme }}<\/p>\n    <button @click=\"toggleTheme\">Temay\u0131 De\u011fi\u015ftir<\/button>\n    <ChildComponent \/>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\nimport { Provide } from 'vue-property-decorator'; \/\/ Provide dekorat\u00f6r\u00fcn\u00fc i\u00e7e aktar\u0131yoruz\nimport ChildComponent from '.\/ChildComponent.vue';\n\n@Options({\n  components: {\n    ChildComponent,\n  },\n})\nexport default class ParentComponent extends Vue {\n  \/\/ @Provide dekorat\u00f6r\u00fc ile veri sa\u011flan\u0131r.\n  \/\/ Sa\u011flanan de\u011fer, bile\u015fen hiyerar\u015fisinde a\u015fa\u011f\u0131ya do\u011fru enjekte edilebilir.\n  \/\/ Sa\u011flanan \u00f6zelli\u011fin ad\u0131, varsay\u0131lan olarak s\u0131n\u0131f \u00f6zelli\u011fi ad\u0131 olur ('theme').\n  @Provide() theme: string = 'light';\n\n  \/\/ \u00d6zel bir anahtar ile veri sa\u011flama\n  @Provide('appConfig')\n  appConfig = {\n    appName: 'My App',\n    version: '1.0.0',\n  };\n\n  toggleTheme(): void {\n    this.theme = this.theme === 'light' ? 'dark' : 'light';\n  }\n}\n<\/script>\n\n\/\/ ChildComponent.vue (veya daha derin bir bile\u015fen)\n<template>\n  <div class=\"child\">\n    <h3>\u00c7ocuk Bile\u015fen<\/h3>\n    <p>Enjekte Edilen Tema: {{ injectedTheme }}<\/p>\n    <p>Uygulama Ad\u0131: {{ config.appName }}<\/p>\n    <GrandchildComponent \/>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\nimport { Inject } from 'vue-property-decorator'; \/\/ Inject dekorat\u00f6r\u00fcn\u00fc i\u00e7e aktar\u0131yoruz\nimport GrandchildComponent from '.\/GrandchildComponent.vue';\n\n@Options({\n  components: {\n    GrandchildComponent,\n  },\n})\nexport default class ChildComponent extends Vue {\n  \/\/ @Inject dekorat\u00f6r\u00fc ile sa\u011flanan veri enjekte edilir.\n  \/\/ Enjekte edilen \u00f6zelli\u011fin ad\u0131, varsay\u0131lan olarak s\u0131n\u0131f \u00f6zelli\u011fi ad\u0131 olur ('injectedTheme').\n  @Inject('theme') readonly injectedTheme!: string; \/\/ 'theme' anahtar\u0131yla sa\u011flanan de\u011feri enjekte et\n\n  \/\/ \u00d6zel anahtar ile enjekte etme\n  @Inject('appConfig') readonly config!: { appName: string; version: string };\n\n  mounted() {\n    console.log('Enjekte edilen tema:', this.injectedTheme);\n    console.log('Enjekte edilen uygulama yap\u0131land\u0131rmas\u0131:', this.config);\n  }\n}\n<\/script>\n\n\/\/ GrandchildComponent.vue (ChildComponent'in bir alt bile\u015feni)\n<template>\n  <div class=\"grandchild\">\n    <h4>Torun Bile\u015fen<\/h4>\n    <p>Enjekte Edilen Tema (Torun): {{ themeFromParent }}<\/p>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\nimport { Inject } from 'vue-property-decorator';\n\n@Options({})\nexport default class GrandchildComponent extends Vue {\n  @Inject('theme') readonly themeFromParent!: string;\n\n  mounted() {\n    console.log('Torun bile\u015fende enjekte edilen tema:', this.themeFromParent);\n  }\n}\n<\/script><\/code><\/pre>\n<p>*   <code>@Provide()<\/code>: Bir de\u011feri veya metodu bile\u015fen hiyerar\u015fisinde alt bile\u015fenlere sunar.<br \/>\n*   <code>@Inject()<\/code>: \u00dcst bile\u015fenler taraf\u0131ndan sa\u011flanan bir de\u011feri veya metodu al\u0131r. <code>!:<\/code> (definite assignment assertion) kullanarak TypeScript&#8217;e bu de\u011ferin \u00e7al\u0131\u015fma zaman\u0131nda var olaca\u011f\u0131n\u0131 bildiririz.<br \/>\n*   <code>@Inject('anahtar')<\/code>: Sa\u011flanan de\u011ferin \u00f6zel bir anahtarla enjekte edilmesini sa\u011flar.<\/p>\n<h4>Mixinler (<code>mixins<\/code>)<\/h4>\n<p>Mixinler, Vue bile\u015fenleri aras\u0131nda yeniden kullan\u0131labilir i\u015flevselli\u011fi payla\u015fman\u0131n bir yoludur. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde mixin&#8217;leri <code>@Options<\/code> dekorat\u00f6r\u00fcn\u00fcn <code>mixins<\/code> \u00f6zelli\u011fi arac\u0131l\u0131\u011f\u0131yla kullanmak daha yayg\u0131nd\u0131r. <code>vue-property-decorator<\/code>&#8216;daki <code>@Mixins<\/code> dekorat\u00f6r\u00fc de mevcuttur ancak TypeScript ile kullan\u0131m\u0131 bazen karma\u015f\u0131k olabilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ myMixin.ts\nimport { Vue } from 'vue-class-component';\n\nexport class MyReusableMixin extends Vue {\n  mixinMessage: string = 'Ben bir mixin mesaj\u0131y\u0131m!';\n\n  sayHelloFromMixin(): void {\n    console.log(this.mixinMessage);\n  }\n\n  \/\/ Mixin i\u00e7inde ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131 da tan\u0131mlanabilir\n  created(): void {\n    console.log('Mixin created hook \u00e7al\u0131\u015ft\u0131!');\n  }\n}\n\n\/\/ MyComponentWithMixin.vue\n<template>\n  <div>\n    <h3>Mixinli Bile\u015fen<\/h3>\n    <p>{{ mixinMessage }}<\/p>\n    <button @click=\"sayHelloFromMixin\">Mixin Metodunu \u00c7al\u0131\u015ft\u0131r<\/button>\n  <\/div>\n<\/template>\n\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\nimport { MyReusableMixin } from '.\/myMixin';\n\n@Options({\n  mixins: [MyReusableMixin], \/\/ Mixin'i burada dahil ediyoruz\n})\nexport default class MyComponentWithMixin extends Vue {\n  \/\/ Bile\u015fenin kendi \u00f6zellikleri\n  componentMessage: string = 'Ben bile\u015fenin kendi mesaj\u0131y\u0131m!';\n\n  mounted(): void {\n    console.log('Bile\u015fen mounted hook \u00e7al\u0131\u015ft\u0131!');\n    this.sayHelloFromMixin(); \/\/ Mixin'den gelen metodu kullanabiliriz\n    console.log(this.mixinMessage); \/\/ Mixin'den gelen \u00f6zelli\u011fi kullanabiliriz\n  }\n}\n<\/script><\/code><\/pre>\n<p>*   Mixin&#8217;ler de <code>Vue<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen s\u0131n\u0131flar olarak tan\u0131mlan\u0131r.<br \/>\n*   <code>@Options<\/code> dekorat\u00f6r\u00fcn\u00fcn <code>mixins<\/code> dizisine mixin s\u0131n\u0131f\u0131n\u0131 eklersiniz.<br \/>\n*   Mixin&#8217;deki veri \u00f6zellikleri, metotlar ve ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131 bile\u015fene &#8220;kar\u0131\u015ft\u0131r\u0131l\u0131r&#8221; ve <code>this<\/code> \u00fczerinden eri\u015filebilir hale gelir. \u00c7ak\u0131\u015fma durumunda bile\u015fenin kendi \u00f6zellikleri \u00f6ncelik al\u0131r.<\/p>\n<h3>\u0130leri D\u00fczey Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenleri kullan\u0131rken g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken baz\u0131 ileri d\u00fczey konular ve en iyi uygulamalar:<\/p>\n<h4>Composition API vs. S\u0131n\u0131f Bile\u015fenleri<\/h4>\n<p>Vue 3&#8217;\u00fcn Composition API&#8217;si, yeniden kullan\u0131labilir mant\u0131k ve daha iyi tip \u00e7\u0131kar\u0131m\u0131 i\u00e7in modern ve \u00f6nerilen yakla\u015f\u0131md\u0131r. Peki ne zaman s\u0131n\u0131f bile\u015fenlerini tercih etmelisiniz?<\/p>\n<p>*   <strong>Mevcut Kod Taban\u0131:<\/strong> E\u011fer projenizde zaten s\u0131n\u0131f tabanl\u0131 bile\u015fenler kullan\u0131l\u0131yorsa, tutarl\u0131l\u0131k i\u00e7in devam etmek mant\u0131kl\u0131 olabilir.<br \/>\n*   <strong>OOP Tercihi:<\/strong> Ekibiniz veya siz OOP prensiplerine daha yatk\u0131nsan\u0131z ve s\u0131n\u0131f yap\u0131s\u0131n\u0131 daha do\u011fal buluyorsan\u0131z.<br \/>\n*   <strong>Belirli K\u00fct\u00fcphane Entegrasyonlar\u0131:<\/strong> Baz\u0131 k\u00fct\u00fcphaneler veya \u00fc\u00e7\u00fcnc\u00fc taraf entegrasyonlar s\u0131n\u0131f tabanl\u0131 bir yap\u0131ya daha iyi uyum sa\u011flayabilir.<\/p>\n<p>Composition API genellikle daha esnek, test edilebilir ve daha iyi tip \u00e7\u0131kar\u0131m\u0131na sahiptir, \u00f6zellikle reaktif de\u011fi\u015fkenler ve fonksiyonlar s\u00f6z konusu oldu\u011funda. Yeni projelerde genellikle Composition API \u00f6nerilirken, s\u0131n\u0131f bile\u015fenleri hala ge\u00e7erli bir alternatif sunar. Her iki yakla\u015f\u0131m da ayn\u0131 projede bir arada var olabilir.<\/p>\n<h4>S\u0131n\u0131f Bile\u015fenlerini Test Etme<\/h4>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenler, Vue Test Utils ile standart Vue bile\u015fenleri gibi test edilebilir. S\u0131n\u0131f yap\u0131s\u0131, metotlar\u0131 ve \u00f6zellikleri do\u011frudan eri\u015filebilir k\u0131ld\u0131\u011f\u0131 i\u00e7in bazen test yazmay\u0131 kolayla\u015ft\u0131rabilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ MyComponent.vue (\u00f6rnek test edilecek bile\u015fen)\n<script lang=\"ts\">\nimport { Options, Vue } from 'vue-class-component';\n\n@Options({})\nexport default class MyComponent extends Vue {\n  count: number = 0;\n\n  increment(): void {\n    this.count++;\n  }\n}\n<\/script>\n\n\/\/ MyComponent.spec.ts (test dosyas\u0131)\nimport { mount } from '@vue\/test-utils';\nimport MyComponent from '.\/MyComponent.vue';\n\ndescribe('MyComponent', () => {\n  it('sayac\u0131 art\u0131r\u0131r', async () => {\n    const wrapper = mount(MyComponent);\n    expect(wrapper.vm.count).toBe(0); \/\/ vm, bile\u015fen \u00f6rne\u011fine eri\u015fim sa\u011flar\n\n    wrapper.vm.increment();\n    await wrapper.vm.$nextTick(); \/\/ Vue'nun DOM g\u00fcncellemesini bekle\n\n    expect(wrapper.vm.count).toBe(1);\n  });\n});<\/code><\/pre>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>S\u0131n\u0131f metotlar\u0131 i\u00e7inde standart <code>try...catch<\/code> bloklar\u0131n\u0131 kullanarak hata y\u00f6netimini uygulayabilirsiniz. Vue&#8217;nun kendi hata yakalama mekanizmalar\u0131 (\u00f6rne\u011fin <code>app.config.errorHandler<\/code>) s\u0131n\u0131f bile\u015fenleri i\u00e7in de ge\u00e7erlidir.<\/p>\n<h4>Performans De\u011ferlendirmeleri<\/h4>\n<p>Genel olarak, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin Options API veya Composition API&#8217;ye g\u00f6re \u00f6nemli bir performans fark\u0131 yoktur. Vue&#8217;nun reaktif sistemi alt\u0131nda ayn\u0131 temel mekanizmalar \u00e7al\u0131\u015f\u0131r. Performans genellikle bile\u015fen say\u0131s\u0131ndan, reaktif veri de\u011fi\u015fikliklerinin s\u0131kl\u0131\u011f\u0131ndan ve DOM manip\u00fclasyonlar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131ndan etkilenir, kullan\u0131lan API stilinden de\u011fil.<\/p>\n<h4>TypeScript Faydalar\u0131<\/h4>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenler, TypeScript&#8217;in sa\u011flad\u0131\u011f\u0131 faydalar\u0131 en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131r:<\/p>\n<p>*   <strong>Tip G\u00fcvenli\u011fi:<\/strong> Veri \u00f6zelliklerinin, prop&#8217;lar\u0131n, emit&#8217;lerin ve metot parametrelerinin tiplerini a\u00e7\u0131k\u00e7a tan\u0131mlayarak \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Otomatik Tamamlama:<\/strong> IDE&#8217;ler, tan\u0131mlanm\u0131\u015f tipler sayesinde kod yazarken do\u011fru \u00f6zellikleri ve metotlar\u0131 otomatik olarak \u00f6nerir.<br \/>\n*   <strong>Refactoring Kolayl\u0131\u011f\u0131:<\/strong> Kod taban\u0131n\u0131 yeniden d\u00fczenlerken, TypeScript derleyicisi olas\u0131 tip hatalar\u0131n\u0131 yakalayarak g\u00fcvenli bir ge\u00e7i\u015f sa\u011flar.<\/p>\n<h4>Potansiyel Tuzaklar<\/h4>\n<p>*   <strong>Dekorat\u00f6r S\u0131ras\u0131:<\/strong> Dekorat\u00f6rlerin belirli bir s\u0131rada olmas\u0131 gerekmez, ancak okunabilirlik a\u00e7\u0131s\u0131ndan mant\u0131kl\u0131 bir s\u0131ra takip etmek iyi bir uygulamad\u0131r.<br \/>\n*   <strong><code>this<\/code> Ba\u011flam\u0131:<\/strong> Arrow fonksiyonlar kullanmak, geri \u00e7a\u011fr\u0131mlarda <code>this<\/code> ba\u011flam\u0131n\u0131n do\u011fru \u015fekilde bile\u015feni i\u015faret etmesini sa\u011flar.<br \/>\n*   <strong>A\u015f\u0131r\u0131 Kal\u0131t\u0131m:<\/strong> S\u0131n\u0131f kal\u0131t\u0131m\u0131 g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, a\u015f\u0131r\u0131ya ka\u00e7mak karma\u015f\u0131k ve bak\u0131m\u0131 zor hiyerar\u015filer olu\u015fturabilir. \u00c7o\u011fu durumda, Composition API veya mixin&#8217;ler (s\u0131n\u0131rl\u0131 kullan\u0131mda) daha iyi alternatifler sunar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue.js ve TypeScript ile s\u0131n\u0131f tabanl\u0131 bile\u015fenler yazmak, \u00f6zellikle nesne y\u00f6nelimli programlama ge\u00e7mi\u015fi olan geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc ve tan\u0131d\u0131k bir alternatif sunar. <code>vue-class-component<\/code> ve <code>vue-property-decorator<\/code> k\u00fct\u00fcphaneleri sayesinde, Vue&#8217;nun reaktif sistemini ve bile\u015fen mimarisini TypeScript s\u0131n\u0131flar\u0131 i\u00e7inde tam olarak kullanabiliriz. <code>@Prop<\/code>, <code>@Emit<\/code>, <code>@Watch<\/code>, <code>@Provide<\/code> ve <code>@Inject<\/code> gibi dekorat\u00f6rler, bile\u015fen \u00f6zelliklerini deklaratif ve tip g\u00fcvenli bir \u015fekilde tan\u0131mlamam\u0131z\u0131 sa\u011flar.<\/p>\n<p>Bu yakla\u015f\u0131m, kodun okunabilirli\u011fini art\u0131r\u0131r, b\u00fcy\u00fck bile\u015fenlerde daha iyi organizasyon sa\u011flar ve TypeScript&#8217;in sundu\u011fu tip g\u00fcvenli\u011fi ve geli\u015ftirici deneyimi avantajlar\u0131ndan tam olarak yararlan\u0131r. Vue 3&#8217;\u00fcn Composition API&#8217;si modern Vue geli\u015ftirmenin tercih edilen yolu olsa da, s\u0131n\u0131f tabanl\u0131 bile\u015fenler hala ge\u00e7erli bir se\u00e7enektir ve belirli projeler veya geli\u015ftirici tercihleri i\u00e7in m\u00fckemmel bir uyum sa\u011flayabilir. Hangi yakla\u015f\u0131m\u0131 se\u00e7ece\u011finiz, ekibinizin al\u0131\u015fkanl\u0131klar\u0131na, projenizin gereksinimlerine ve uzun vadeli bak\u0131m stratejinize ba\u011fl\u0131 olacakt\u0131r. \u00d6nemli olan, se\u00e7ti\u011finiz yakla\u015f\u0131m\u0131n projenizin genel sa\u011fl\u0131\u011f\u0131na ve geli\u015ftirici verimlili\u011fine katk\u0131da bulunmas\u0131d\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi\nVue.js, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in a\u015famal\u0131 olarak benimsenebilen","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":[1402],"tags":[],"class_list":{"0":"post-36716","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","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>Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi Vue.js, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in a\u015famal\u0131 olarak benimsenebilen\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T22:41:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi\",\"datePublished\":\"2025-12-21T22:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\"},\"wordCount\":2842,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\",\"name\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-21T22:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi\"}]},{\"@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":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi","og_description":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi Vue.js, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in a\u015famal\u0131 olarak benimsenebilen","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-21T22:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi","datePublished":"2025-12-21T22:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/"},"wordCount":2842,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/","name":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-21T22:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-yazma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Yazma Rehberi"}]},{"@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\/36716","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=36716"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36716\/revisions"}],"predecessor-version":[{"id":36717,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36716\/revisions\/36717"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}