TypeScript: dilin özü, sıkı tür denetimi ve React Native

Yazar: IT Sectr Yayınlanma: 2026-02-10 Okuma süresi: 12 dk

TypeScript, Microsoft tarafından geliştirilen, JavaScript'in sıkı bir şekilde tür denetimli üst kümesidir. Mevcut JS koduyla tam uyumluluğu korurken bir tür sistemi, arayüzler, generics ve dekoratörler ekler. Derleme zamanında tür denetimi sayesinde TypeScript, React Native, Angular ve diğer çerçevelerde bir sınıf hatayı önler. State of JS Anketi'ne (2025) göre, ankete katılan geliştiricilerin %78'i TypeScript kullanıyor. Daha fazla bilgi için TypeScript dokümantasyonuna bakın.

Önemli Noktalar

  • TypeScript — derleme zamanı denetimi ile JS üzerinde statik tür denetimi
  • Arayüzler — isteğe bağlı alanlarla nesne şekilleri için sözleşmeler
  • Generics — fonksiyonlar ve sınıflar için genelleştirilmiş türler
  • React Native — yeni projelerin %65'i props ve state tür denetimi için TypeScript kullanır
  • tsc — çalışma zamanını değiştirmeden TS'yi JS'ye dönüştüren derleyici

TypeScript Nedir?

TypeScript, Microsoft (2012) tarafından Anders Hejlsberg (C# ve Turbo Pascal'ın yaratıcısı) tarafından oluşturulmuş bir programlama dilidir. TypeScript, JavaScript'i statik bir tür sistemi, arayüzler, generics, numaralandırmalar ve dekoratörlerle genişletir. TS kodu, tsc derleyicisi veya Babel aracılığıyla saf JavaScript'e (dönüştürme) derlenir — çıktı, her ortamda çalışan standart JS'dir.

TypeScript'in oluşturulma motivasyonu, büyük projelerde JavaScript'in sınırlamalarıdır. JS'nin dinamik tür denetimi, yalnızca çalışma zamanında keşfedilen hatalara yol açar: undefined is not a function, Cannot read property of null. TypeScript, tür denetimini derleme zamanına taşıyarak bu hataları kod yürütülmeden önler. Proje ne kadar büyükse, TS'nin faydaları o kadar büyük olur: 100.000+ satırlık bir kod tabanında, TS yüzlerce potansiyel hatayı önler.

TypeScript'in temel bir özelliği, tsconfig.json'da isteğe bağlı strict: true bayrağı ile sıkı tür denetimidir. Sıkı mod tüm denetimleri etkinleştirir: strictNullChecks (null/undefined diğer türlerle uyumsuz), noImplicitAny (örtük any'yi yasaklar), strictFunctionTypes (fonksiyon parametrelerinin kontravaryansı). Varsayılan olarak, tüm yeni projeler için strict: true önerilir.

TypeScript vs JavaScript

TypeScript, JavaScript'ten yalnızca geliştirme aşamasında farklılık gösterir. Derlemeden sonra türler silinir — çalışma zamanı, performans kaybı olmadan normal JS yürütür. Bu bir ödünleşimdir: geliştirme ek bir derleme adımı gerektirir, ancak IDE'de otomatik tamamlama, sembol yeniden adlandırmayla yeniden düzenleme ve doğrudan kodda tür dokümantasyonu sağlar.

YönJavaScriptTypeScript
Tür denetimiDinamik, çalışma zamanıStatik, derleme zamanı
Dosya uzantısı.js.ts (veya React için .tsx)
Tür hatalarıÇalışma zamanında keşfedilirYürütmeden önce keşfedilir
GenericsHayırEvet (Generic types)
ArayüzlerHayır (yalnızca JSDoc)Evet (interface + type)
DerlemeGerekli değilGerekli (tsc / Babel)

TypeScript Tür Sistemi

TypeScript'in tür sistemi yapısaldır, nominal değildir: iki tür, adlarından bağımsız olarak yapıları eşleşiyorsa uyumludur. Bu, uyumluluğun sınıf veya arayüz adıyla belirlendiği Java/C#'dan farklıdır. Yapısal tür denetimi, mevcut JS koduyla entegrasyonu basitleştirir — her tür için implements bildirmek gerekmez.

Temel ve Gelişmiş Türler

TypeScript, JS temel türlerine ek olarak şunları destekler: any (denetimi devre dışı bırakır), unknown (güvenli any — kullanımdan önce denetim gerektirir), never (asla dönmez), void (dönüş yok), tuple (sabit uzunlukta demet), enum (numaralandırma), union (string | number), intersection (A & B), literal ('red' | 'blue'), index signature ([key: string]: number).

typescript
// TypeScript temel tür sistemi
// İlkel türler
const name: string = 'React Native';
const version: number = 0.73;
const isReady: boolean = true;

// Union ve Literal türleri
type Platform = 'ios' | 'android' | 'web';
type Status = 'idle' | 'loading' | 'success' | 'error';

function getSDKVersion(platform: Platform): number {
  switch (platform) {
    case 'ios': return 17;
    case 'android': return 34;
    case 'web': return 2025;
  }
}

// Tuple — sabit uzunlukta demet
type Coordinate = [number, number];
const position: Coordinate = [55.75, 37.61];

// Enum — otomatik artan numaralandırma
enum AppState {
  Background,
  Foreground,
  Inactive
}

// Unknown — any'ye güvenli alternatif
function parseJSON(json: string): unknown {
  return JSON.parse(json);
}

const data = parseJSON('{"name":"TS"}');
if (typeof data === 'object' && data !== null) {
  console.log((data as Record<string, unknown>).name);
}

Platform türü, değerleri üç seçenekle sınırlayan bir dize değişmezleri birleşimidir. 'windows' geçirirseniz, TypeScript hata verir. Coordinate demeti tam olarak iki sayıyı garanti eder — koordinatlar veya RGB renkleri için kullanışlıdır. AppState enum'u ters eşleme ile bir nesneye derlenir. Unknown, kullanımdan önce tür denetimini zorunlu kılar — any'nin aksine, unknown varsayılan olarak güvenlidir.

Arayüzler ve Tür Takma Adları

Arayüzler ve tür takma adları TypeScript'te nesne şekillerini tanımlar. Arayüzler bildirim birleştirmeyi (yeniden bildirim alan ekler) ve genişletmeyi (extends) destekler. Tür takma adları birleşimler, kesişimler, demetler ve koşullu türleri tanımlayabilir ancak bildirim birleştirmeyi desteklemez. Kural: API nesneleri için interface, diğer her şey için type kullanın.

typescript
// React Native için arayüzler ve türler
// İsteğe bağlı alanlarla arayüz
interface User {
  id: string;
  name: string;
  email: string;
  avatar?: string; // isteğe bağlı alan
  readonly createdAt: Date; // salt okunur
}

// Arayüz genişletme (extends)
interface AdminUser extends User {
  role: 'admin';
  permissions: string[];
}

// API verileri için tür
type ApiResponse<T> = {
  data: T;
  status: Status;
  error?: string;
};

// Utility types — Partial tüm alanları isteğe bağlı yapar
type PartialUser = Partial<User>;

// Pick — belirtilen alanları seçer
type UserPreview = Pick<User, 'id' | 'name' | 'avatar'>;

// Record — tür denetimli anahtarlarla sözlük
type UserMap = Record<string, User>;

User arayüzü ? (isteğe bağlı alan) ve readonly (salt okunur) ile. ApiResponse<T> API yanıtları için genel bir arayüzdür. Partial<User> tüm alanları isteğe bağlı yapan bir yardımcı türdür (düzenleme formları için kullanışlı). Pick<User, 'id' | 'name'> yalnızca belirtilen alanları seçer — önizleme bileşenleri için kullanışlıdır. Record<string, User> kimliğe göre kullanıcı sözlüğüdür.

Generics ve Yardımcı Türler

Generics, TypeScript'in temel bir özelliğidir ve tür güvenliğini kaybetmeden herhangi bir türle çalışan bileşenler oluşturmanıza olanak tanır. Genel bir işlev, açılı parantezler içinde bir tür parametresiyle tanımlanır: function identity<T>(arg: T): T. T türü, bağımsız değişkenden otomatik olarak çıkarılır veya açıkça belirtilir: identity<string>('hello').

Yardımcı türler, tür dönüşümleri için yerleşik genericslerdir: Partial<T> (tüm alanlar isteğe bağlı), Required<T> (tüm alanlar zorunlu), Readonly<T> (tüm alanlar salt okunur), Pick<T, K> (alanları seç), Omit<T, K> (alanları çıkar), Record<K, T> (sözlük), Exclude<T, U> (birleşimden çıkar), Extract<T, U> (birleşimden ayıkla), NonNullable<T> (null/undefined'ı çıkar).

typescript
// TypeScript'te Generics
// API ile çalışmak için genel işlev
async function fetchData<T>(url: string): Promise<T> {
  const response = await fetch(url);

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json() as Promise<T>;
}

// Belirli bir türle kullanım
interface Product {
  id: number;
  title: string;
  price: number;
}

const products = await fetchData<Product[]>('/api/products');

// Durum yönetimi için genel sınıf
class StateManager<S> {
  private state: S;

  constructor(initial: S) {
    this.state = initial;
  }

  getState(): S {
    return this.state;
  }

  updateState(partial: Partial<S>): void {
    this.state = { ...this.state, ...partial };
  }
}

// Redux Reducer ile tür denetimli çalışma
type Action<T, P> = {
  type: T;
  payload: P;
};

type UserAction =
  | Action<'SET_USER', User>
  | Action<'CLEAR_USER', undefined>
  | Action<'UPDATE_USER', Partial<User>>;

fetchData<T> işlevi, fetch çevresinde tür denetimli bir sarmalayıcıdır. T parametresi yanıt şeklini belirler: fetchData<Product[]> çağrılırken TypeScript, döndürülen dizinin Product nesneleri içerdiğini bilir. StateManager<S> sınıfı herhangi bir türün durumunu yönetir — kısmi güncellemeler için Partial<S>. Action<T, P>, switch'te otomatik tür daraltma ile Redux eylemleri için ayırt edilmiş bir birleşimdir.

React Native'de TypeScript

React Native'de TypeScript, bileşen props ve state için sıkı tür denetimi sağlar. React Native CLI, .tsx uzantılı ve tsconfig.json içeren bir şablon oluşturur. PropTypes (JS), TypeScript arayüzleriyle değiştirilir — denetim çalışma zamanında değil, derleme zamanında yapılır. styled-components ve React Navigation tam tür desteğine sahiptir.

Bileşen Tür Denetimi

React.FC<Props>, props'a sahip işlevsel bir bileşenin türüdür. Children otomatik olarak tür denetimlidir. useRef<T> — yerel bir bileşene referans. useState<S> — tür çıkarımı ile durum. useNavigation<T> — tür denetimli gezinme. useCallback, useMemo — otomatik tür çıkarımı ile. Tüm React hook'ları tamamen tür denetimlidir.

typescript
// Tür denetimli React Native bileşeni
import React, { useState, useCallback } from 'react';
import {
  View, Text, FlatList, TouchableOpacity,
  StyleSheet
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';

// Navigasyon ve veri için türler
type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string };
  Settings: undefined;
};

type NavigationProp =
  NativeStackNavigationProp<RootStackParamList, 'Home'>;

// Props için arayüz
interface ProductListProps {
  products: Product[];
  onSelect: (id: number) => void;
}

// Tür denetimli işlevsel bileşen
const ProductList: React.FC<ProductListProps> = ({
  products,
  onSelect
}) => {
  const navigation = useNavigation<NavigationProp>();
  const [selectedId, setSelectedId] = useState<number | null>(null);

  const handlePress = useCallback((id: number) => {
    setSelectedId(id);
    onSelect(id);
    navigation.navigate('Profile', { userId: String(id) });
  }, [onSelect, navigation]);

  const renderItem = useCallback(({ item }: { item: Product }) => (
    <TouchableOpacity onPress={() => handlePress(item.id)}>
      <Text>{item.title}</Text>
      <Text>${item.price.toFixed(2)}</Text>
    </TouchableOpacity>
  ), [handlePress]);

  return (
    <FlatList
      data={products}
      renderItem={renderItem}
      keyExtractor={(item) => String(item.id)}
    />
  );
};

RootStackParamList türü, parametreleriyle birlikte yolların bir sözlüğüdür. NavigationProp, tür denetimli gezinme sağlar: navigation.navigate('Profile', { userId }), Profile'in userId'yi kabul ettiğini doğrular. Tür denetimli parametrelerle useCallback, gereksiz yeniden oluşturmaları önler. FlatList, generics aracılığıyla tür denetimlidir: — data ve renderItem otomatik olarak tür alır.

TypeScript Geliştirici Araçları

TypeScript araçları, tsc derleyicisi, tsconfig.json, VS Code'da IDE desteği, @typescript-eslint ile ESLint, Prettier ve DefinitelyTyped'ı (@types/*) içerir. tsc, .ts'yi .js'ye dönüştüren derleyicidir. tsconfig.json şunları yapılandırır: target (ES2020), module (ESNext), strict: true, outDir (çıktı klasörü). sourceMap — kod haritaları aracılığıyla tarayıcıda TS hata ayıklama.

DefinitelyTyped, yerleşik türleri olmayan kitaplıklar için tür tanımları deposudur. Kurulum: npm install @types/react @types/react-native --save-dev. .d.ts dosyaları tür bildirimleridir. Modern kitaplıklar (React, React Native, Angular) yerleşik türler içerir ve @types/ gerektirmez. Eski JS kitaplıkları için DefinitelyTyped tek tür kaynağıdır.

json
// tsconfig.json — minimum yapılandırma
{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "strict": true,
    "jsx": "react-native",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "noEmit": true // yalnızca denetim, JS oluşturma yok
  },
  "include": ["src/**/*.ts", "src/**/*.tsx"],
  "exclude": ["node_modules", "babel.config.js"]
}

strict: true seçeneği tüm tür denetimlerini etkinleştirir — tüm projeler için önerilir. jsx: 'react-native' JSX'i dönüşüm olmadan korur (React Native, JSX'i Babel aracılığıyla işler). moduleResolution: 'node' — Node.js'deki gibi modül çözümlemesi. esModuleInterop — CommonJS modülleriyle uyumluluk. noEmit: true — JS dosyaları oluşturmadan yalnızca denetim (Babel veya Metro JS'yi oluşturur).

Sıkça Sorulan Sorular

TypeScript nedir?

TypeScript, Microsoft'un (2012) JavaScript'in sıkı tür denetimli bir üst kümesidir. Statik tür denetimi, arayüzler, generics, numaralandırmalar ve dekoratörler ekler. tsc aracılığıyla saf JS'ye derlenir. Herhangi bir JS koduyla uyumludur. React Native (yeni projelerin ~%65'i), Angular ve Node.js'de kullanılır. Anders Hejlsberg (C#'ın yaratıcısı) tarafından oluşturulmuştur.

React Native'de neden TypeScript kullanılır?

TypeScript, React bileşenlerinin props ve state'i için sıkı tür denetimi sağlar — tür hataları çalışma zamanında değil, derleme zamanında yakalanır. IDE otomatik tamamlama tüm kitaplıklar için çalışır. Generics karmaşık yapıları (Redux store, API) tür denetiminden geçirir. React Navigation tam yol tür denetimine sahiptir. Anketlere göre, JS geliştiricilerinin %78'i TypeScript kullanıyor.

TypeScript JavaScript'e nasıl derlenir?

tsc derleyicisi .ts/.tsx dosyalarını ayrıştırır, türleri denetler, ek açıklamaları kaldırır ve .js oluşturur. Hedef (ES5, ES2020) tsconfig.json'da ayarlanır. TypeScript çalışma zamanını değiştirmez — silinen türler performansı etkilemez. Kaynak haritalar, hata ayıklama için derlenmiş JS'yi orijinal TS'ye bağlar. @babel/preset-typescript ile Babel, tsc'ye bir alternatiftir.

TypeScript hangi veri türlerini destekler?

TypeScript tüm JS türlerini içerir: string, number, boolean, null, undefined, symbol, any. Şunları ekler: void, never, unknown, tuple, enum, union (string | number), intersection (A & B), literal ('red' | 'blue'), Record, Pick, Omit, Partial, Required, Readonly, Extract, Exclude, NonNullable. Generics genelleştirilmiş türler oluşturur: Array<number>, Promise<string>, Map<string, User>.

TypeScript geliştirme için hangi araçlar gereklidir?

tsc derleyicisi typescript npm paketinde bulunur. VS Code — yerel TS desteği, otomatik tamamlama, yeniden düzenleme ile IDE. tsconfig.json sıkı modu yapılandırır. @typescript-eslint/parser ile ESLint — statik analiz. Prettier — biçimlendirme. DefinitelyTyped (@types/*) — yerleşik desteği olmayan kitaplıklar için türler. React Native CLI, TypeScript şablonu içerir.

Özet

  • TypeScript — tsc aracılığıyla saf JS'ye derleme ile JS üzerinde statik tür denetimi
  • Arayüzler ve tür takma adları isteğe bağlı ve salt okunur alanlarla nesne şekillerini tanımlar
  • Generics — fonksiyonlar, sınıflar ve yardımcı türler (Partial, Pick, Record) için genelleştirilmiş türler
  • React Native — RootStackParamList aracılığıyla props, state ve navigasyonun sıkı tür denetimi
  • strict: true — tüm yeni projeler için zorunlu tsconfig.json seçeneği
  • DefinitelyTyped — kendi türleri olmayan kitaplıklar için @types/ paketleri
  • Geliştiricilerin %78'i State of JS (2025)'e göre TypeScript kullanıyor

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun