ProgramlamaFrontend Geliştirici

TypeScript'ta Namespace nedir, ne için kullanılır ve modülden (module) nasıl farklıdır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Namespace (isim alanı) — mantıksal olarak ilişkili varlıkları bir araya getirmek için, pre-ES6 kod dönemlerinden kalma bir kod organizasyonu mekanizmasıdır. Büyük projeleri yapılandırmaya yardımcı olur, sınıfları, fonksiyonları, arabirimleri ve türleri tek bir isim alanında bir araya getirerek isim çakışmalarını önler ve kodun okunabilirliğini artırır.

Tarihçe: JavaScript ES6 standartları çıkmadan önce geliştiriciler, modülerliği taklit etmek için IIFE, nesneler ve isim alanları kullanıyordu. TypeScript, kodu gruplamak için namespace anahtar kelimesini (eski adıyla internal module) tanıttı.

Sorun: Modern modüller (ES6 Module) standart haline geldi ve her iki yaklaşım (namespace ve modül) paralel varlığını sürdürüyor, bu da mimari tasarımda karışıklığa yol açıyor — ne zaman namespace, ne zaman module kullanmak daha iyi?

Çözüm: Namespace'ler, özellikle outFile çıktısı ile tek bir JS dosyası oluşturulan saf TypeScript projelerinde yardımcı fonksiyonlar ve türleri bir araya getirmek için hala faydalıdır. Özellikle npm ve modern derleyicilerle çalışırken, kodu dosyalar arasında bölmek için modüllerin kullanılması daha doğru olacaktır. Namespace'ler genellikle iç kütüphanelerde, tür açıklamalarında ve bir dosya içinde yapılandırmanın gerektiği eski kod durumlarında uygulanır.

Kod örneği:

namespace MyMath { export function add(a: number, b: number) { return a + b; } } console.log(MyMath.add(2, 3)); // 5

Temel özellikler:

  • Mantıksal olarak ilgili kodları bir araya getirmeye olanak tanır.
  • Sınıflar, türler, fonksiyonlar, sabitler içerebilir.
  • Genellikle outFile seçeneği ile kullanılır, modern projelerde modüllerle nadiren kullanılır.

İkna edici sorular.

Farklı dosyalardaki namespace'leri birleştirirseniz, bir tane mi yoksa birden fazla mı namespace olur?

TypeScript, declaration merging işlemi gerçekleştirir — isimlerin çakışması durumunda, uygun şekilde bağlanmış ve aynı kapsamda bulunan farklı isim alanları bir araya getirilir.

// mathA.ts namespace MathUtil { export function sum(a: number, b: number) { return a + b; } } // mathB.ts namespace MathUtil { export function mul(a: number, b: number) { return a * b; } } // Derleme sonrası MathUtil her iki yöntemi de içerir.

Namespace'i modül gibi import/require olarak kullanabilir miyiz?

Hayır, namespace'in varsayılan/isimli bir dışa aktarma özelliği yoktur, standart ES6 sözdizimi ile içe aktarılamaz. Namespace, JavaScript modüllerine çevrilemeyen tamamen TypeScript konseptidir.

Başka bir dosyadan namespace'den değerleri import edebilir miyim?

Hayır, başka dosyalardan namespace'e erişmek için reference (/// <reference path="..." />) kullanmak veya outFile ile derlemek gereklidir, import ile içe aktarma mümkün değildir.

Tipik hatalar ve anti-patörnler

  • Aynı projede namespace ve modülleri karıştırmak
  • Namespace'i modül gibi içe aktarmaya çalışmak
  • Her küçük kod parçası için namespace kullanmak (parçalanma)

Gerçek yaşam örneği

Olumsuz durum

Eski bir projede mantık, onlarca namespace'e bölündü, aynı isimler birkaç dosyada yer aldı ve bu bazen beklenmedik bir şekilde birleşmelere veya çakışmalara yol açtı. Modüler mimariye geçerken kodun taşınması çok çetrefilli hale geldi.

Artılar:

  • Fonksiyonları hızlı bir şekilde gruplama
  • Küçük betikler için basitlik

Eksiler:

  • Gerçek modüllerle karışmak
  • Ölçeklendirme zorlaşmak
  • Dosyalar arasındaki bağımlılıkları yönetmek karmaşıklaşmak

Olumlu durum

Büyük bir kütüphanede, tüm türleri ve arabirimleri kod uygulanmadan bir index.d.ts dosyasında deklare ederek API'yi tanımladılar. Bu, kütüphane kullanıcılarını hızlı bir şekilde tiplandırmayı ve ekipler arasındaki sözleşmeyi kolayca güncellemeyi sağladı.

Artılar:

  • API'nin net bir şekilde gruplandığı
  • Sözleşmenin güncellenmesinin kolaylığı

Eksiler:

  • Modül tabanlı yeni projelere entegre etmek daha zor
  • Npm otomatik açıklayıcıları desteklenmez.