Menu
Coddy logo textTech

Union Tipler ile Çalışmak

Coddy'nin JavaScript Journey'sinin TypeScript'e Giriş bölümünün bir parçası — ders 32 / 73.

Union tipleriyle çalıştığınızda, TypeScript önemli bir güvenlik kuralını zorunlu kılar: yalnızca union içindeki tüm tiplerde mevcut olan özelliklere ve metotlara erişebilirsiniz. Bu, çalışma zamanı (runtime) hatalarını önler ancak tipe özgü özelliklere erişmek için özel tekniklere ihtiyacınız olduğu anlamına gelir.

Hem bir dizeyi (string) hem de dize dizisini (array of strings) kabul eden bir fonksiyon düşünün. Her iki tür de bir length özelliğine sahiptir, bu nedenle bu özelliğe güvenle erişebilirsiniz:

function getLength(input: string | string[]): number {
  return input.length; // Safe - both types have length
}

Ancak, yalnızca bir türde bulunan bir yöntemi kullanmaya çalışırsanız, TypeScript bir hata gösterecektir. Türe özgü üyelere güvenli bir şekilde erişmek için bir type guard'a (türü daraltan bir çalışma zamanı kontrolü) ihtiyacınız vardır:

function processInput(input: string | string[]): void {
  if (typeof input === "string") {
    // TypeScript burada input'un bir string olduğunu bilir
    console.log(input.toUpperCase());
  } else {
    // TypeScript burada input'un string[] olduğunu bilir
    console.log(input.join(", "));
  }
}

typeof operatörü en yaygın tür korumalarından (type guards) biridir. Kontrolden sonra, TypeScript her bir dal içindeki türü otomatik olarak daraltır ve tam tür güvenliğini korurken size türe özgü özelliklere ve yöntemlere tam erişim sağlar.

challenge icon

Görev

Kolay

string | string[] tipinde input adında bir parametre kabul eden ve bir number döndüren processData adında bir fonksiyon oluşturun. Fonksiyon, girdi tipini belirlemek için bir tip koruması (type guard) kullanmalı ve şu şekilde davranmalıdır:

  • Eğer girdi bir string ise, uzunluğunu döndürün
  • Eğer girdi bir string[] ise, dizideki tüm dizelerin toplam karakter sayısını döndürün

number | boolean tipinde content adında bir parametre kabul eden ve bir string döndüren formatMessage adında başka bir fonksiyon oluşturun. Fonksiyon, girdi tipini belirlemek için bir tip koruması (type guard) kullanmalı ve şu şekilde davranmalıdır:

  • Eğer girdi bir number ise, "Value: [number]" döndürün
  • Eğer girdi bir boolean ise, "Status: [boolean]" döndürün

Aşağıdaki girdiler sağlanacaktır:

  • Birinci girdi: tek bir kelimeyi veya ["apple", "banana", "cherry"] gibi dizelerden oluşan bir JSON dizisini temsil eden bir dize
  • İkinci girdi: bir sayıyı veya bir boolean değeri ("true" veya "false") temsil eden bir dize

Girdileri şu şekilde işleyin:

  • Birinci girdi için: eğer "[" ile başlıyorsa, onu bir JSON dize dizisi olarak ayrıştırın; aksi takdirde, onu tek bir dize olarak ele alın
  • İkinci girdi için: eğer "true" veya "false" ise, onu bir boolean değere dönüştürün; aksi takdirde, bir sayıya dönüştürün

İşlenmiş birinci girdi ile processData fonksiyonunu çağırın ve sonucu yazdırın. Ardından işlenmiş ikinci girdi ile formatMessage fonksiyonunu çağırın ve sonucu yazdırın.

Kendin dene

import * as fs from "fs";

// Girdileri oku
const stdinBuffer: Buffer = fs.readFileSync(0);
const inputs: string[] = stdinBuffer.toString().trim().split('\n');
const firstInput = inputs[0];
const secondInput = inputs[1];

// TODO: Kodunuzu buraya yazın
// Tip korumalı (type guard) processData fonksiyonunu oluşturun
// Tip korumalı (type guard) formatMessage fonksiyonunu oluşturun
// Girdileri gereksinimlere göre işleyin
// Fonksiyonları çağırın ve sonuçları yazdırın
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

TypeScript'e Giriş bölümündeki tüm dersler