Geri

TypeScript'te String ile Çalışmak

TypeScript'te String ile Çalışmak

String'ler, herhangi bir programlama dilinde en sık kullanılan veri tiplerinden biridir ve TypeScript de bu konuda bir istisna değildir. Kullanıcı girdilerini işlemek, dinamik mesajlar oluşturmak veya API'lerle çalışmak gibi durumlarda string türünü etkili bir şekilde kullanmayı bilmek oldukça önemlidir. Bu yazıda, TypeScript'te string'lerin nasıl çalıştığını, yaygın string işlemlerini ve kodunuzu daha temiz ve sağlam hale getirecek en iyi uygulamaları inceleyeceğiz.

Bu yazıda öğrenecekleriniz

String türünün temel kullanımı

String değerlerle birlik türlerinin (union types) nasıl kullanılacağı

Şablon (template literal) türlerinin ne olduğu ve ne zaman kullanılacağı

Zorlayıcı örnek durumlar

String Türünün Temel Kullanımı

TypeScript'te string türünün temel kullanımı, bir değişkene string türü tanımlayıp karakter dizisi atamakla başlar.

 let message: string = "Working with string in TypeScript!";

Not: Eğer bir değişkeni değer atayarak başlatırsanız, türünü açıkça belirtmenize gerek yoktur. TypeScript, türü otomatik olarak çıkarır.

Not: Bir değişkeni const ile tanımlarsanız, türü doğrudan atanan değerden çıkarılır çünkü const ile tanımlanan değişkenler yeniden atanamaz.

String Değerlerle Union Tür Kullanımı

Union string türü, bir değişkenin önceden belirlenmiş bir string değer kümesinden yalnızca birini almasını sağlar. Bu, daha hassas tür kontrolü ve daha okunabilir kod anlamına gelir.

// union string type for request type
type RequestType = 'POST' | 'GET' | 'PUT'

// Another example with directions
type Direction = "up" | "down" | "left" | "right";

Template Literal Türleri ve Kullanım Alanları

TypeScript'teki template literal türleri, JavaScript'teki şablon string yapısına benzer şekilde, sabit string türlerini birleştirerek yeni string türleri oluşturmanıza olanak tanır.

Bu türler, çalışma zamanında dinamik string'ler oluşturmaya benzer şekilde, tür düzeyinde string desenleri tanımlamak için kullanılır.

Template literal türleriyle özel string formatları tanımlayabiliriz. Bu yapı, JavaScript'teki regex (düzenli ifade) mantığına benzer şekilde çalışır.

type GetWhatever =get${Capitalize<string>}
const getApple: GetWhatever = 'getApple'
const getBanana: GetWhatever = 'getbanana' // not Valid
const getBanana2: GetWhatever = 'getBanana' // Valid

Union Türlerini Birleştirme

String union türlerini tek bir string türü içinde birleştirebiliriz. Örneğin:

type Cordinate = 'X' | 'Y' | 'Z'
type Nums = '0' | '1' | '2'

type Cartesian = `${Cordinate}${Nums}`
// output:
// type Cartesian = 'X0' | 'X1' | 'X2' | 'Y0' | 'Y1' | 'Y2' | 'Z0' | 'Z1' | 'Z2'

Ön Ek ve Son Ek Kullanımı

Template literal türlerinde ön ek (prefix) veya son ek (suffix) kullanarak katı string formatları tanımlayabiliriz. Bu yapı genellikle dosya adları, URL'ler veya özel tanımlayıcılar için kullanılır.

type AllowedFiles = `${string}.jpg` | `${string}.png`;
let file1: AllowedFiles = "file1.jpg";  // valid
let file2: AllowedFiles = "file2.png";  // valid
let file3: AllowedFiles = "doc.pdf";    // invalid

Zorlayıcı Bir Örnek

Şimdiye kadar öğrendiklerimize dayanarak bir örnek oluşturalım:

Bu örnekte bir türümüz var ve bu tür bir istek (request) sunuyor. Şimdi bunu daha iyi hale getireceğiz.

type RequestType = {
  method: 'POST' | 'GET'
  url: string
  body: object
}

Aslında bu örnek görevini yerine getiriyor gibi görünüyor:

const getUserRequest: RequestType = {
  url: 'www.test.com/getUsers',
  method: 'GET',
  body: null
}

Ancak, farklı türde verilerle bu yapı kötüye kullanılabilir:

const getUserRequest: RequestType = {
  url: 'testtesttesttest', // seems valid
  method: 'GET',
  body: null, // not needed for GET request
}

URL'nin daha kısıtlayıcı olması ve body özelliğinin yalnızca POST isteklerinde bulunması gerekir.

Hadi bunu daha güvenli hale getirelim:

URL için şablon türü kullanarak http isteği formatıyla sınırlandıracağız. Body alanını ise yalnızca POST isteklerinde aktif hale getireceğiz.

type RequestType = {
  method: 'POST'
  url:`http://${string}.com`
  body: object
} | {
  method: 'GET'
  url: http://${string}.com
}

Hâlâ daha da iyisini yapabiliriz: URL'yi ortak hale getirip https desteği de ekleyebiliriz.

type RequestType = { 
url:`http://www.${string}.com${string}` | `https://www.${string}.com${string}`}
& ({
    method: 'POST'
    body: object
  } | {
    method: 'GET'
  })

const getUserRequest: RequestType = {
  url: 'http://www.test.com', // seems valid
  method: 'POST',
  body: { organizationId: 2 }
}

Artık hem http hem de https destekleniyor ve body alanı sadece POST istekleri için geçerli.

Geri