ViraStack
  • Academy
  • About
  • Support
HomeSourcesContribute
ViraStack

A DX-first toolkit for frontend developers: starters, agent rules, form hooks, and a guide.

Products

  • ViraStack Start
  • ViraStack AI
  • ViraStack Mask
  • ViraStack Password
  • ViraStack Guide

Explore

  • Academy
  • About
  • Brand
  • Support

© 2026 ViraStack.

Open source · MIT

TypeScript

08 / 09

tsconfig ve strict mod

Derleyici ayarları, strict bayrakları ve CI'da tip kontrolü.

tsconfig.json Nedir

Bir klasörde tsconfig.json bulunması, o klasörün bir TypeScript projesinin kökü olduğunu gösterir. Dosya hangi dosyaların kontrol edileceğini ve hangi kuralların uygulanacağını tanımlar. tsc'yi dosya adı vermeden çalıştırdığınızda derleyici bu dosyayı bulunduğunuz klasörden başlayıp yukarı doğru arar.1

{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "strict": true,
    "noEmit": true
  },
  "include": ["src"]
}
AlanNe işe yarar
compilerOptionsDerleyici ayarları; bu dersin büyük kısmı bunlarla ilgili
includeProjeye dahil edilecek dosya ya da klasörler (tsconfig'e göre göreli)2
extendsAyarları başka bir tsconfig dosyasından devralır2
referencesProjeyi birbirine bağlı küçük parçalara böler (Vite şablonu bunu kullanır)

strict Modu

TypeScript'in sıkılığı tek bir anahtardan çok bir ayar düğmesi gibidir: kontrolleri tek tek açıp kapatabilirsiniz. "strict": true hepsini birden açar.3

BayrakNe yapar
noImplicitAnyTipi çıkarılamayan değişken ve parametrelerin sessizce any olmasını engeller
strictNullChecksnull ve undefined'ı ayrı tip yapar; kontrol etmeden kullanamazsınız
strictFunctionTypesFonksiyon parametrelerini daha sıkı karşılaştırır
strictBindCallApplybind, call ve apply argümanlarını kontrol eder
strictPropertyInitializationClass alanlarının constructor'da başlatılmasını ister
strictBuiltinIteratorReturnYerleşik iterator'ların dönüş değerini any yerine undefined sayar
noImplicitThisTipi belirsiz this kullanımını hata sayar
useUnknownInCatchVariablescatch (error) içindeki error'u any yerine unknown yapar
alwaysStrictÇıktıya JavaScript'in "use strict" modunu uygular

Bayrak listesi TSConfig referansındaki strict ailesidir.4 En çok fark edeceğiniz ikisi noImplicitAny ve strictNullChecks'tir:

function getProduct(id) {}
// Hata: Parameter 'id' implicitly has an 'any' type.

try {
  await fetchProducts();
} catch (error) {
  console.log(error.message);
  // Hata: 'error' is of type 'unknown'.
}

TypeScript 6.0 ile strict varsayılan olarak açık hale geldi, TypeScript 7 de bu varsayılanı korudu.56 Yine de dosyaya "strict": true yazmak niyetinizi açıkça gösterir. Eski bir projeyi taşırken bile strict'i tamamen kapatmak yerine bayrakları tek tek açın.

strict'e Ek Bayraklar

noUncheckedIndexedAccess

strict'in parçası değildir ama en faydalı ek bayraktır. Dizi elemanına ya da index signature'lı bir nesneye erişimin sonucuna undefined ekler.7 Dizinin boş olabileceğini unutmanızı engeller:

const products: Product[] = await fetchProducts();

const first = products[0]; // Product | undefined
console.log(first.name);
// Hata: 'first' is possibly 'undefined'.

if (first) {
  console.log(first.name); // artık Product
}

Matt Pocock bu bayrağın aslında strict'e dahil olması gerektiğini söyler.8 TypeScript 7'de tsc --init de onu açık olarak üretir. Vite şablonunda ise kapalıdır; kendiniz eklemeniz gerekir.

Diğerleri

BayrakNe yaparÖneri
noUnusedLocalsKullanılmayan yerel değişkeni hata sayar2Vite şablonunda açık
noUnusedParametersKullanılmayan parametreyi hata sayar; _ ile başlayanlar hariç2Vite şablonunda açık
noFallthroughCasesInSwitchbreak'i unutulmuş case'leri yakalarVite şablonunda açık
exactOptionalPropertyTypesdiscountCode?: string alanına açıkça undefined atamayı yasaklar4İsteğe bağlı; sıkı ama gürültülü

Matt Pocock ise noUnusedLocals gibi bayrakları "gürültülü" bulur ve yalnızca isteyenlerin eklemesini önerir.8 İkisi de geçerli bir seçim; ekip olarak birini seçin.

React Uygulaması İçin Ayarlar

Vite ya da Next.js kullanan bir uygulamada JavaScript'i TypeScript üretmez, bundler üretir. TypeScript yalnızca tip denetleyicisi olarak çalışır. Bu yüzden ayarlar buna göre seçilir:

AyarDeğerAnlamı
targetes2023Hangi JavaScript sürümünün söz dizimine izin verildiği
lib["ES2023", "DOM"]Hangi global API'lerin tipli olduğu; tarayıcı kodu için DOM şart9
moduleesnextModern import/export; TypeScript 7'de varsayılan6
moduleResolutionbundlerImport'ları bundler gibi çözer; göreli import'ta uzantı istemez4
jsxreact-jsxReact 17+ JSX dönüşümü; her dosyada import React gerekmez10
noEmittrueJavaScript dosyası üretmez, yalnızca kontrol eder
verbatimModuleSyntaxtruetype ile işaretlenmemiş import'lar kalır, işaretlenenler tamamen silinir; import type yazmaya zorlar11
isolatedModulestrueTek dosyaya bakarak çeviren araçların (Oxc, SWC, esbuild) desteklemediği kodu hata sayar12
erasableSyntaxOnlytrueenum, parameter property gibi çalışma anı kodu üreten TypeScript söz dizimini yasaklar (TypeScript 5.8)13
skipLibChecktruenode_modules içindeki .d.ts dosyalarını kontrol etmez; hız kazandırır8

verbatimModuleSyntax açıkken yalnızca tip olan import'ları şöyle yazarsınız:

import type { Product } from "./types";
import { formatPrice, type CartItem } from "./cart";

Vite Şablonundaki Üç Dosya

npm create vite@latest -- --template react-ts (create-vite 9.2) üç dosya üretir:

DosyaKapsam
tsconfig.jsonKendisi dosya içermez ("files": []), diğer ikisine references verir
tsconfig.app.jsonsrc klasörü: tarayıcıda çalışan uygulama kodu, lib içinde DOM var
tsconfig.node.jsonvite.config.ts: Node'da çalışan yapılandırma, types içinde node var

Uygulama kodu ile Node'da çalışan yapılandırma farklı ortamlarda çalıştığı için ayrı ayarlarla kontrol edilir. tsconfig.app.json'ın özü şöyledir:

{
  "compilerOptions": {
    "target": "es2023",
    "lib": ["ES2023", "DOM"],
    "module": "esnext",
    "types": ["vite/client"],
    "skipLibCheck": true,
    "moduleResolution": "bundler",
    "verbatimModuleSyntax": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "react-jsx",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["src"]
}

Dosyada strict yok, çünkü şablonun kurduğu TypeScript 6.0'da zaten varsayılan. types: ["vite/client"] ise import.meta.env ve resim, CSS import'ları için tipleri ekler.14

references kullanan bir projede tip kontrolü tsc -b (--build) ile yapılır; bu komut referans verilen projeleri bulur ve doğru sırayla kontrol eder.15 Şablondaki build script'i de tsc -b && vite build'dir.

Caution

Kök dizinde npx tsc --noEmit çalıştırmak bu şablonda hiçbir dosyayı kontrol etmez, çünkü kök tsconfig.json boştur. Komut hata olsa bile başarıyla biter. npx tsc -b ya da npx tsc --noEmit -p tsconfig.app.json kullanın.

Next.js'te tsconfig

Next.js projesi create-next-app ile açıldığında tsconfig.json hazır gelir; var olan bir projede bir dosyayı .ts yapıp next dev çalıştırdığınızda Next.js dosyayı kendisi oluşturur.16 Üretilen dosyada strict, noEmit, moduleResolution: "bundler", jsx: "react-jsx", isolatedModules, @/* path alias'ı ve Next.js'in editör eklentisi ("plugins": [{ "name": "next" }]) bulunur. Ayrıca next-env.d.ts adında, elle düzenlenmemesi gereken bir tip dosyası üretilir.16

next build tip hatası varsa build'i durdurur. typescript.ignoreBuildErrors bu kontrolü kapatır; dokümantasyon bunu ancak tip kontrolünü başka bir yerde çalıştırıyorsanız önerir.16

Path Alias

../../../components/ProductCard gibi uzun göreli yollar yerine @/components/ProductCard yazmak için paths kullanılır:

{
  "compilerOptions": {
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

paths yalnızca TypeScript'e bu eşlemeyi anlatır; çıktıdaki import'ları değiştirmez. Eşlemeyi çalışma anında bundler'ın da bilmesi gerekir.4 Vite'ta bunun için vite.config.ts içinde resolve: { tsconfigPaths: true } ayarını açarsınız.14 Next.js paths'i kendisi okur.

Warning

Eski rehberlerde paths ile birlikte "baseUrl": "." görürsünüz. baseUrl TypeScript 6.0'da kullanımdan kaldırıldı, TypeScript 7'de ise tamamen silindi; Option 'baseUrl' has been removed. hatası verir.56 Yolların başına ./ ekleyerek baseUrl olmadan yazın.

@types Paketleri ve .d.ts

JavaScript ile yazılmış bir kütüphanenin tipleri declaration (.d.ts) dosyalarında durur. Birçok paket bu dosyaları kendisi getirir; getirmeyenler için topluluğun yazdığı tipler @types/ önekiyle yayımlanır (@types/react, @types/node).17 Bir paketi import ettiğinizde "Could not find a declaration file" hatası alıyorsanız önce npm install -D @types/<paket-adı> deneyin.

TypeScript 6.0'dan itibaren types ayarının varsayılanı boş dizidir: global tipler (örneğin Node'un process'i) artık kendiliğinden yüklenmez, "types": ["node"] gibi açıkça yazmanız gerekir.5 Vite şablonundaki types satırları bu yüzden var.

typescript-eslint

tsc tip hatalarını bulur; hatalı ama tip açısından geçerli kalıpları (örneğin beklenmeyen bir Promise) ise linter bulur. ESLint için TypeScript desteğini typescript-eslint sağlar. Tip bilgisini kullanan kurallar için recommendedTypeChecked ya da daha katı strictTypeChecked yapılandırması seçilir ve projectService açılır:18

// eslint.config.mjs
import js from "@eslint/js";
import { defineConfig } from "eslint/config";
import tseslint from "typescript-eslint";

export default defineConfig({
  files: ["**/*.{ts,tsx}"],
  extends: [
    js.configs.recommended,
    tseslint.configs.recommendedTypeChecked,
  ],
  languageOptions: {
    parserOptions: {
      projectService: true,
    },
  },
});

typescript-eslint, strictTypeChecked'i yalnızca ekibin önemli bir kısmı TypeScript'te deneyimliyse önerir.19

Tip

typescript-eslint şu an >=4.8.4 <6.1.0 aralığındaki TypeScript sürümlerini destekler.20 TypeScript 7 henüz bir API sunmadığı için TypeScript ekibi, linter gibi araçlar için 6.0'ı @typescript/typescript6 paketiyle yanında tutmayı öneriyor.6 Güncel Vite şablonu ise ESLint yerine oxlint ile gelir.

CI'da Tip Kontrolü

Bundler tip kontrolü yapmadığı için, hatalı kodun ana dala girmemesini garanti etmenin yolu CI'da tsc çalıştırmaktır.21 Önce package.json'a bir script ekleyin:

{
  "scripts": {
    "typecheck": "tsc -b"
  }
}

Next.js ya da tek tsconfig'li bir projede değer tsc --noEmit olur. Ardından GitHub Actions iş akışı:22

# .github/workflows/ci.yml
name: CI

on:
  pull_request:
  push:
    branches: [main]

jobs:
  typecheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm
      - run: npm ci
      - run: npm run typecheck

Pull request'te tip hatası varsa bu adım kırmızıya döner. Lint ve test adımlarını aynı job'a ekleyebilirsiniz.

Kendin Dene

  • Vite şablonunun tsconfig.app.json dosyasına "noUncheckedIndexedAccess": true ekleyin ve npx tsc -b ile kaç yeni hata çıktığına bakın.

  • TS Playground'un TS Config menüsünden strict'i kapatıp açın; aynı kodda hangi hataların kaybolduğunu izleyin.

  • @/* alias'ını hem paths hem resolve.tsconfigPaths ile kurun; yalnızca birini açınca editörün ve vite build'in nasıl davrandığını karşılaştırın.

  • Bir dosyaya bilerek tip hatası koyup CI iş akışının kırmızıya döndüğünü görün.

Detaylı Öğrenmek İçin

  • Yazı: Matt Pocock'un TSConfig Cheat Sheet'i; bundler kullanan ve kullanmayan projeler için hazır bloklar.8

  • Kitap: Matt Pocock'un Total TypeScript Essentials kitabının "Configuring TypeScript" bölümü; extends, lib, jsx ve project references.23

  • Resmi doküman: TSConfig Reference; her ayarın açıklaması ve örneği.4

  • Resmi doküman: typescript-eslint'in "Linting with Type Information" rehberi.18

  • Yazı: TypeScript 6.0 duyurusu; değişen varsayılanlar ve baseUrl olmadan paths yazımı.5

Kaynaklar

  • 1DocsTypeScript Handbook: What is a tsconfig.json

    Proje kökü, `tsc`'nin dosyayı araması ve `extends` ile hazır temel ayarlar.

  • 2DocsTSConfig Reference: Root Fields

    `include`, `extends`, `references`, `noUnusedLocals` ve `noUnusedParameters` açıklamaları.

  • 3DocsTypeScript Handbook: The Basics — Strictness

    Sıkılığın bir düğme gibi olması, `noImplicitAny` ve `strictNullChecks`.

  • 4DocsTSConfig Reference: strict

    Strict ailesindeki bayraklar, `exactOptionalPropertyTypes`, `moduleResolution: bundler` ve `paths`.

  • 5ArticleAnnouncing TypeScript 6.0

    `strict` ve `types: []` varsayılanları, `baseUrl`'in kullanımdan kalkması ve `paths` yazımı.

  • 6ArticleAnnouncing TypeScript 7.0

    7.0 varsayılanları, kaldırılan ayarlar ve `@typescript/typescript6` ile araç uyumluluğu.

  • 7DocsTSConfig Reference: noUncheckedIndexedAccess

    Index signature erişimine `undefined` eklenmesi ve örneği.

  • 8ArticleMatt Pocock

    : — Önerilen temel ve strict ayarlar, `noUncheckedIndexedAccess` ve `skipLibCheck` gerekçeleri.

  • 9Docsreact.dev: Using TypeScript

    React projesinde `lib` içinde `dom` ve geçerli bir `jsx` ayarı gerekmesi.

  • 10DocsTSConfig Reference: jsx

    `react-jsx` ile `react/jsx-runtime` dönüşümü.

  • 11DocsTSConfig Reference: verbatimModuleSyntax

    `type` işaretli import'ların silinip diğerlerinin olduğu gibi kalması.

  • 12DocsTSConfig Reference: isolatedModules

    Tek dosya çalışan dönüştürücülerin sınırları.

  • 13ArticleAnnouncing TypeScript 5.8

    `--erasableSyntaxOnly` bayrağının tanıtımı ve gerekçesi.

  • 14DocsVite: Features — TypeScript

    Tip kontrolü yapılmaması, `isolatedModules` önerisi ve `vite/client` tipleri; `resolve.tsconfigPaths` için .

  • 15DocsTypeScript Handbook: Project References

    `references` ve `tsc -b`'nin projeleri doğru sırayla derlemesi.

  • 16DocsNext.js: TypeScript

    Otomatik `tsconfig.json`, `next-env.d.ts`, build sırasında tip kontrolü ve `ignoreBuildErrors`.

  • 17DocsTypeScript Handbook: Consumption

    `@types/` paketlerini kurmak ve kendi tipini getiren paketler.

  • 18Docstypescript-eslint: Linting with Type Information

    `recommendedTypeChecked`, `strictTypeChecked` ve `projectService` ile örnek yapılandırma.

  • 19Docstypescript-eslint: Shared Configs

    Hazır yapılandırmalar ve `strict-type-checked` için uyarı.

  • 20Docstypescript-eslint: Dependency Versions

    Desteklenen TypeScript sürüm aralığı.

  • 21ArticleMatt Pocock

    : — `tsc --noEmit`'i linter gibi kullanmak ve CI'da tip kontrolü.

  • 22DocsGitHub Docs: Building and testing Node.js

    `actions/checkout`, `actions/setup-node`, npm önbelleği ve `npm ci`.

  • 23ArticleMatt Pocock

    : — Temel yapılandırma, `strict`, `isolatedModules`, `verbatimModuleSyntax` ve project references.

Edit this page

Last updated: October 17, 2026

Previous step07. React'te tiplerNext step09. Tipli ürün kataloğuProject