Türkçe

TypeScript şablon dizgi türlerini ve bunların yüksek düzeyde tip güvenli ve sürdürülebilir API'lar oluşturarak kod kalitesini ve geliştirici deneyimini nasıl iyileştirdiğini keşfedin.

Tip Güvenli API'lar için TypeScript Şablon Dizgi Türleri

TypeScript şablon dizgi türleri, TypeScript 4.1'de sunulan ve tür seviyesinde dize manipülasyonu yapmanıza olanak tanıyan güçlü bir özelliktir. Yüksek düzeyde tip güvenli ve sürdürülebilir API'lar oluşturmak için bir dizi olasılık sunarak, normalde yalnızca çalışma zamanında ortaya çıkacak hataları derleme zamanında yakalamanızı sağlarlar. Bu da geliştirici deneyimini iyileştirir, yeniden düzenlemeyi kolaylaştırır ve daha sağlam kodlar ortaya çıkarır.

Şablon Dizgi Türleri Nedir?

Özünde, şablon dizgi türleri, dize değişmez türlerini, birleşim türlerini ve tür değişkenlerini birleştirerek oluşturulabilen dize değişmez türleridir. Bunları türler için dize enterpolasyonu olarak düşünebilirsiniz. Bu, mevcut olanlara dayalı yeni türler oluşturmanıza olanak tanıyarak yüksek derecede esneklik ve ifade gücü sağlar.

İşte basit bir örnek:

type Greeting = "Hello, World!";

type PersonalizedGreeting<T extends string> = `Hello, ${T}!`;

type MyGreeting = PersonalizedGreeting<"Alice">; // type MyGreeting = "Hello, Alice!"

Bu örnekte, PersonalizedGreeting, bir dize olması gereken genel bir tür parametresi olan T'yi alan bir şablon dizgi türüdür. Daha sonra "Hello, " dize değişmezini, T'nin değeriyle ve "!" dize değişmeziyle enterpolasyon yaparak yeni bir tür oluşturur. Ortaya çıkan tür, MyGreeting, "Hello, Alice!" olur.

Şablon Dizgi Türlerini Kullanmanın Faydaları

Gerçek Dünya Kullanım Senaryoları

1. API Uç Noktası Tanımlama

Şablon dizgi türleri, API uç noktası türlerini tanımlamak için kullanılabilir, böylece API'ye doğru parametrelerin geçirilmesini ve yanıtın doğru şekilde işlenmesini sağlar. USD, EUR ve JPY gibi birden fazla para birimini destekleyen bir e-ticaret platformu düşünün.

type Currency = "USD" | "EUR" | "JPY";
type ProductID = string; //Pratikte bu daha spesifik bir tür olabilir

type GetProductEndpoint<C extends Currency> = `/products/${ProductID}/${C}`;

type USDEndpoint = GetProductEndpoint<"USD">; // type USDEndpoint = "/products/${string}/USD"

Bu örnek, bir para birimini tür parametresi olarak alan bir GetProductEndpoint türü tanımlar. Ortaya çıkan tür, belirtilen para biriminde bir ürünü almak için API uç noktasını temsil eden bir dize değişmez türüdür. Bu yaklaşımı kullanarak, API uç noktasının her zaman doğru şekilde oluşturulduğundan ve doğru para biriminin kullanıldığından emin olabilirsiniz.

2. Veri Doğrulama

Şablon dizgi türleri, derleme zamanında verileri doğrulamak için kullanılabilir. Örneğin, bir telefon numarası veya e-posta adresinin biçimini doğrulamak için bunları kullanabilirsiniz. Ülke koduna göre farklı biçimlere sahip olabilen uluslararası telefon numaralarını doğrulamanız gerektiğini hayal edin.

type CountryCode = "+1" | "+44" | "+81"; // ABD, İngiltere, Japonya
type PhoneNumber<C extends CountryCode, N extends string> = `${C}-${N}`;

type ValidUSPhoneNumber = PhoneNumber<"+1", "555-123-4567">; // type ValidUSPhoneNumber = "+1-555-123-4567"

//Not: Daha karmaşık doğrulama, şablon dizgi türlerini koşullu türlerle birleştirmeyi gerektirebilir.

Bu örnek, belirli bir formatı zorunlu kılan temel bir telefon numarası türünü nasıl oluşturabileceğinizi gösterir. Daha karmaşık doğrulama, koşullu türleri ve şablon değişmezi içindeki düzenli ifade benzeri desenleri kullanmayı gerektirebilir.

3. Kod Üretimi

Şablon dizgi türleri, derleme zamanında kod üretmek için kullanılabilir. Örneğin, gösterdikleri verilerin adına göre React bileşen adları oluşturmak için bunları kullanabilirsiniz. Yaygın bir desen, <Entity>Details desenini takip eden bileşen adları oluşturmaktır.

type Entity = "User" | "Product" | "Order";
type ComponentName<E extends Entity> = `${E}Details`;

type UserDetailsComponent = ComponentName<"User">; // type UserDetailsComponent = "UserDetails"

Bu, tutarlı ve açıklayıcı bileşen adlarını otomatik olarak oluşturmanıza olanak tanır, bu da adlandırma çakışmaları riskini azaltır ve kod okunabilirliğini artırır.

4. Olay Yönetimi

Şablon dizgi türleri, olay adlarını tip güvenli bir şekilde tanımlamak için mükemmeldir, bu da olay dinleyicilerinin doğru şekilde kaydedilmesini ve olay işleyicilerinin beklenen verileri almasını sağlar. Olayların modül ve olay türüne göre kategorize edildiği ve iki nokta üst üste ile ayrıldığı bir sistem düşünün.

type Module = "user" | "product" | "order";
type EventType = "created" | "updated" | "deleted";
type EventName<M extends Module, E extends EventType> = `${M}:${E}`;

type UserCreatedEvent = EventName<"user", "created">; // type UserCreatedEvent = "user:created"

interface EventMap {
  [key: EventName<Module, EventType>]: (data: any) => void; //Örnek: Olay yönetimi için tür
}

Bu örnek, tutarlı bir deseni takip eden olay adlarının nasıl oluşturulacağını gösterir, bu da olay sisteminin genel yapısını ve tip güvenliğini artırır.

İleri Seviye Teknikler

1. Koşullu Türlerle Birleştirme

Şablon dizgi türleri, daha da karmaşık tür dönüşümleri oluşturmak için koşullu türlerle birleştirilebilir. Koşullu türler, diğer türlere bağlı olan türler tanımlamanıza olanak tanır, bu da tür seviyesinde karmaşık mantık gerçekleştirmenizi sağlar.

type ToUpperCase<S extends string> = S extends Uppercase<S> ? S : Uppercase<S>;

type MaybeUpperCase<S extends string, Upper extends boolean> = Upper extends true ? ToUpperCase<S> : S;

type Example = MaybeUpperCase<"hello", true>; // type Example = "HELLO"
type Example2 = MaybeUpperCase<"world", false>; // type Example2 = "world"

Bu örnekte, MaybeUpperCase bir dize ve bir boole değeri alır. Eğer boole doğruysa, dizeyi büyük harfe çevirir; aksi takdirde, dizeyi olduğu gibi döndürür. Bu, dize türlerini koşullu olarak nasıl değiştirebileceğinizi gösterir.

2. Eşlenmiş Türlerle Kullanım

Şablon dizgi türleri, bir nesne türünün anahtarlarını dönüştürmek için eşlenmiş türlerle kullanılabilir. Eşlenmiş türler, mevcut bir türün anahtarları üzerinde yineleme yaparak ve her anahtara bir dönüşüm uygulayarak yeni türler oluşturmanıza olanak tanır. Yaygın bir kullanım durumu, nesne anahtarlarına bir önek veya sonek eklemektir.

type MyObject = {
  name: string;
  age: number;
};

type AddPrefix<T, Prefix extends string> = {
  [K in keyof T as `${Prefix}${string & K}`]: T[K];
};

type PrefixedObject = AddPrefix<MyObject, "data_">;
// type PrefixedObject = {
//    data_name: string;
//    data_age: number;
// }

Burada, AddPrefix bir nesne türü ve bir önek alır. Ardından, aynı özelliklere sahip ancak her anahtara önek eklenmiş yeni bir nesne türü oluşturur. Bu, veri aktarım nesneleri (DTO'lar) veya özelliklerin adlarını değiştirmeniz gereken diğer türleri oluşturmak için yararlı olabilir.

3. Dahili Dize Manipülasyon Türleri

TypeScript, Uppercase, Lowercase, Capitalize ve Uncapitalize gibi çeşitli dahili dize manipülasyon türleri sunar. Bunlar, daha karmaşık dize dönüşümleri gerçekleştirmek için şablon dizgi türleriyle birlikte kullanılabilir.

type MyString = "hello world";

type CapitalizedString = Capitalize<MyString>; // type CapitalizedString = "Hello world"

type UpperCasedString = Uppercase<MyString>;   // type UpperCasedString = "HELLO WORLD"

Bu dahili türler, özel tür mantığı yazmak zorunda kalmadan yaygın dize manipülasyonlarını gerçekleştirmeyi kolaylaştırır.

En İyi Uygulamalar

Sık Karşılaşılan Tuzaklar

Alternatifler

Şablon dizgi türleri, API geliştirmede tip güvenliği sağlamak için güçlü bir yol sunsa da, belirli durumlarda daha uygun olabilecek alternatif yaklaşımlar da vardır.

Sonuç

TypeScript şablon dizgi türleri, tip güvenli ve sürdürülebilir API'lar oluşturmak için değerli bir araçtır. Tür seviyesinde dize manipülasyonu yapmanıza olanak tanıyarak, derleme zamanında hataları yakalamanızı ve kodunuzun genel kalitesini artırmanızı sağlarlar. Bu makalede tartışılan kavramları ve teknikleri anlayarak, daha sağlam, güvenilir ve geliştirici dostu API'lar oluşturmak için şablon dizgi türlerinden yararlanabilirsiniz. İster karmaşık bir web uygulaması ister basit bir komut satırı aracı oluşturuyor olun, şablon dizgi türleri daha iyi TypeScript kodu yazmanıza yardımcı olabilir.

Potansiyellerini tam olarak kavramak için daha fazla örnek keşfetmeyi ve kendi projelerinizde şablon dizgi türleriyle denemeler yapmayı düşünün. Onları ne kadar çok kullanırsanız, sözdizimleri ve yetenekleri konusunda o kadar rahat olursunuz, bu da gerçekten tip güvenli ve sağlam uygulamalar oluşturmanıza olanak tanır.