CodeBlanks Logo Icon CodeBlanks

Phantom ile API

Phantom türlerle güvenli API tasarımını öğrenirsin.

Phantom ile API tasarımı

Phantom türler, API fonksiyonlarının yanlış sırada veya yanlış argümanlarla çağrılmasını engeller. Örneğin bir HTTP isteği türü, kimlik doğrulama durumunu phantom argüman olarak taşıyabilir; böylece send yalnızca Authenticated durumundaki istekleri kabul eder.

type Request<Auth> = { url: string };

type Anonymous = Request<"anonymous">;
type Authenticated = Request<"authenticated">;

function authenticate(r: Anonymous): Authenticated {
  return r;
}

function send(r: Authenticated): string {
  return r.url;
}

Derleme zamanı güvenliği

Phantom ile tasarlanan API'de hatalı kullanım derleme hatası verir; örneğin send fonksiyonu Anonymous bir istekle çağrılamaz. Bu, çalışma zamanı hatalarını önler ve kodu güvenli hale getirir.

const req: Anonymous = { url: "/api" };
const authed = authenticate(req);
send(authed);  // geçerli
send(req);     // hata: Anonymous, Authenticated değil

Uygulama Phantom ile kimlik doğrulama akışı

Request<Auth> generic türünü tanımla (gövde url: string). Anonymous ve Authenticated türlerini phantom argümanlarla oluştur. authenticate(r: Anonymous): Authenticated ve send(r: Authenticated): string fonksiyonlarını yaz. Bir Anonymous değerinden başla, authenticate ile doğrula, send ile URL'i al ve console.log ile yazdır.

Başlangıç kodu

index.ts
// Request<Auth> generic türünü tanımla (Auth gövdede kullanılmasın)

// Anonymous ve Authenticated türlerini phantom argümanlarla oluştur

// authenticate ve send fonksiyonlarını yaz

// Anonymous değerinden başla, authenticate ve send uygula, sonucu yazdır

Örnek çözüm

index.ts
type Request<Auth> = { url: string };

type Anonymous = Request<"anonymous">;
type Authenticated = Request<"authenticated">;

function authenticate(r: Anonymous): Authenticated {
  return r;
}

function send(r: Authenticated): string {
  return r.url;
}

const req: Anonymous = { url: "/api" };
const url = send(authenticate(req));

console.log(url);

Beklenen çıktı

/api

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Phantom ile güvenli API tasarımında amaç nedir?

  • API çağrılarını gizlemek
  • API fonksiyonlarının yalnızca doğru sıra ve durumda çağrılmasını sağlamak Doğru cevap
  • Daha kısa fonksiyon imzaları yazmak
  • Çalışma zamanında parametre doğrulaması

Açıklama: Phantom ile API'de her fonksiyon yalnızca belirli bir durumdaki değeri kabul eder; böylece yanlış sıra veya eksik adım derleme hatası olur.

2 send fonksiyonu hangi türü kabul eder

Soru
type Request<Auth> = { url: string };
type Anonymous = Request<"anonymous">;
type Authenticated = Request<"authenticated">;

function send(r: ____): string { return r.url; }
Cevap
type Request<Auth> = { url: string };
type Anonymous = Request<"anonymous">;
type Authenticated = Request<"authenticated">;

function send(r: Authenticated): string { return r.url; }

Açıklama: send yalnızca Authenticated istekleri kabul eder; bu, kimliği doğrulanmamış isteğin gönderilmesini derleme zamanında engeller.

3 Phantom API parçaları

Kavram Anlamı
Anonymous durumu henüz doğrulanmamış
Authenticated durumu send için hazır
send(r: Authenticated) yalnızca doğrulanmış isteği kabul eder
Phantom Auth parametresi kimlik durumunu taşır

İleri seviye bölümündeki tüm dersler