Türkçe

Değişmez tür çıkarımı için TypeScript const assertion'larının gücünü keşfedin, projelerinizde kod güvenliğini ve öngörülebilirliği artırın. Pratik örneklerle bunları nasıl etkili bir şekilde kullanacağınızı öğrenin.

TypeScript Const Assertions: Sağlam Kod için Değişmez Tür Çıkarımı

JavaScript'in bir üst kümesi olan TypeScript, web geliştirmenin dinamik dünyasına statik tipleme getirir. Güçlü özelliklerinden biri, derleyicinin bir değişkenin türünü otomatik olarak çıkardığı tür çıkarımıdır. TypeScript 3.4'te tanıtılan const assertions (sabit iddiaları), tür çıkarımını bir adım öteye taşıyarak değişmezliği zorunlu kılmanıza ve daha sağlam ve öngörülebilir kod oluşturmanıza olanak tanır.

Const Assertions Nedir?

Const assertions, TypeScript derleyicisine bir değerin değişmez (immutable) olmasını amaçladığınızı söylemenin bir yoludur. Bir literal değer veya ifadeden sonra as const sözdizimi kullanılarak uygulanırlar. Bu, derleyiciye ifade için mümkün olan en dar (literal) türü çıkarması ve tüm özellikleri readonly (salt okunur) olarak işaretlemesi talimatını verir.

Özünde, const assertions, bir değişkeni sadece const ile bildirmekten daha güçlü bir tür güvenliği seviyesi sağlar. const, değişkenin kendisinin yeniden atanmasını engellerken, değişkenin referans verdiği nesnenin veya dizinin değiştirilmesini engellemez. Const assertions, nesnenin özelliklerinin de değiştirilmesini önler.

Const Assertions Kullanmanın Faydaları

Pratik Örnekler

Örnek 1: Bir Literal ile Temel Kullanım

Const assertion olmadan, TypeScript message değişkeninin türünü string olarak çıkarır:


const message = "Merhaba, Dünya!"; // Tür: string

Const assertion ile, TypeScript türü literal string olan "Merhaba, Dünya!" olarak çıkarır:


const message = "Merhaba, Dünya!" as const; // Tür: "Merhaba, Dünya!"

Bu, literal string türünü daha hassas tür tanımlarında ve karşılaştırmalarda kullanmanıza olanak tanır.

Örnek 2: Dizilerle Const Assertions Kullanımı

Bir renk dizisini ele alalım:


const colors = ["red", "green", "blue"]; // Tür: string[]

Dizi const ile bildirilmiş olsa bile, elemanlarını yine de değiştirebilirsiniz:


colors[0] = "purple"; // Hata yok
console.log(colors); // Çıktı: ["purple", "green", "blue"]

Bir const assertion ekleyerek, TypeScript diziyi salt okunur string'lerden oluşan bir demet (tuple) olarak çıkarır:


const colors = ["red", "green", "blue"] as const; // Tür: readonly ["red", "green", "blue"]

Şimdi, diziyi değiştirmeye çalışmak bir TypeScript hatasıyla sonuçlanacaktır:


// colors[0] = "purple"; // Hata: 'readonly ["red", "green", "blue"]' türündeki dizin imzası yalnızca okumaya izin verir.

Bu, colors dizisinin değişmez kalmasını sağlar.

Örnek 3: Nesnelerle Const Assertions Kullanımı

Dizilere benzer şekilde, nesneler de const assertions ile değişmez hale getirilebilir:


const person = {
  name: "Alice",
  age: 30,
}; // Tür: { name: string; age: number; }

const ile bile, person nesnesinin özelliklerini değiştirebilirsiniz:


person.age = 31; // Hata yok
console.log(person); // Çıktı: { name: "Alice", age: 31 }

Bir const assertion eklemek, nesnenin özelliklerini readonly yapar:


const person = {
  name: "Alice",
  age: 30,
} as const; // Tür: { readonly name: "Alice"; readonly age: 30; }

Şimdi, nesneyi değiştirmeye çalışmak bir TypeScript hatasıyla sonuçlanacaktır:


// person.age = 31; // Hata: 'age' özelliğine atama yapılamaz çünkü bu salt okunur bir özelliktir.

Örnek 4: İç İçe Nesneler ve Dizilerle Const Assertions Kullanımı

Const assertions, derinlemesine değişmez veri yapıları oluşturmak için iç içe nesnelere ve dizilere uygulanabilir. Aşağıdaki örneği inceleyin:


const config = {
  apiUrl: "https://api.example.com",
  endpoints: {
    users: "/users",
    products: "/products",
  },
  supportedLanguages: ["en", "fr", "de"],
} as const;

// Tür:
// {
//   readonly apiUrl: "https://api.example.com";
//   readonly endpoints: {
//     readonly users: "/users";
//     readonly products: "/products";
//   };
//   readonly supportedLanguages: readonly ["en", "fr", "de"];
// }

Bu örnekte, config nesnesi, iç içe geçmiş endpoints nesnesi ve supportedLanguages dizisi readonly olarak işaretlenmiştir. Bu, yapılandırmanın hiçbir parçasının çalışma zamanında kazara değiştirilememesini sağlar.

Örnek 5: Fonksiyon Dönüş Tipleri ile Const Assertions

Bir fonksiyonun değişmez bir değer döndürmesini sağlamak için const assertions kullanabilirsiniz. Bu, girdilerini değiştirmemesi veya değiştirilebilir çıktı üretmemesi gereken yardımcı fonksiyonlar oluştururken özellikle kullanışlıdır.


function createImmutableArray(items: T[]): readonly T[] {
  return [...items] as const;
}

const numbers = [1, 2, 3];
const immutableNumbers = createImmutableArray(numbers);

// immutableNumbers'ın türü: readonly [1, 2, 3]

// immutableNumbers[0] = 4; // Hata: 'readonly [1, 2, 3]' türündeki dizin imzası yalnızca okumaya izin verir.

Kullanım Durumları ve Senaryolar

Yapılandırma Yönetimi

Const assertions, uygulama yapılandırmasını yönetmek için idealdir. Yapılandırma nesnelerinizi as const ile bildirerek, yapılandırmanın uygulama yaşam döngüsü boyunca tutarlı kalmasını sağlayabilirsiniz. Bu, beklenmedik davranışlara yol açabilecek kazara değişiklikleri önler.


const appConfig = {
  appName: "Uygulamam",
  version: "1.0.0",
  apiEndpoint: "https://api.example.com",
} as const;

Sabitleri Tanımlama

Const assertions, belirli literal türlerle sabitler tanımlamak için de kullanışlıdır. Bu, tür güvenliğini ve kod netliğini artırabilir.


const HTTP_STATUS_OK = 200 as const; // Tür: 200
const HTTP_STATUS_NOT_FOUND = 404 as const; // Tür: 404

Redux veya Diğer Durum Yönetimi Kütüphaneleri ile Çalışma

Redux gibi durum yönetimi kütüphanelerinde değişmezlik temel bir ilkedir. Const assertions, reducer'larınızda ve action creator'larınızda değişmezliği zorunlu kılmaya yardımcı olarak kazara durum mutasyonlarını önleyebilir.


// Örnek Redux reducer'ı

interface State {
  readonly count: number;
}

const initialState: State = { count: 0 } as const;

function reducer(state: State = initialState, action: { type: string }): State {
  switch (action.type) {
    default:
      return state;
  }
}

Uluslararasılaştırma (i18n)

Uluslararasılaştırma ile çalışırken, genellikle desteklenen diller ve bunlara karşılık gelen yerel kodlar kümeniz olur. Const assertions, bu kümenin değişmez kalmasını sağlayarak i18n uygulamanızı bozabilecek kazara eklemeleri veya değişiklikleri önleyebilir. Örneğin, İngilizce (en), Fransızca (fr), Almanca (de), İspanyolca (es) ve Japonca (ja) dillerini desteklediğinizi düşünün:


const supportedLanguages = ["en", "fr", "de", "es", "ja"] as const;

type SupportedLanguage = typeof supportedLanguages[number]; // Tür: "en" | "fr" | "de" | "es" | "ja"

function greet(language: SupportedLanguage) {
  switch (language) {
    case "en":
      return "Hello!";
    case "fr":
      return "Bonjour!";
    case "de":
      return "Guten Tag!";
    case "es":
      return "¡Hola!";
    case "ja":
      return "こんにちは!";
    default:
      return "Bu dil için selamlama mevcut değil.";
  }
}

Sınırlamalar ve Dikkat Edilmesi Gerekenler

Const Assertions'a Alternatifler

Const assertions değişmezliği zorlamak için güçlü bir araç olsa da, göz önünde bulundurabileceğiniz başka yaklaşımlar da vardır:

En İyi Uygulamalar

Sonuç

TypeScript const assertions, kodunuzda değişmezliği zorlamak ve tür güvenliğini artırmak için değerli bir araçtır. as const kullanarak, derleyiciye bir değer için mümkün olan en dar türü çıkarması ve tüm özellikleri readonly olarak işaretlemesi talimatını verebilirsiniz. Bu, kazara yapılan değişiklikleri önlemeye, kod öngörülebilirliğini artırmaya ve daha hassas tür denetimini sağlamaya yardımcı olabilir. Const assertions'ın bazı sınırlamaları olsa da, TypeScript diline güçlü bir eklentidir ve uygulamalarınızın sağlamlığını önemli ölçüde artırabilir.

Const assertions'ı TypeScript projelerinize stratejik olarak dahil ederek daha güvenilir, sürdürülebilir ve öngörülebilir kod yazabilirsiniz. Değişmez tür çıkarımının gücünü benimseyin ve yazılım geliştirme uygulamalarınızı bir üst seviyeye taşıyın.