0Pricing
TypeScript Academy · Ders

Genel arayüzler ve tür takma adları

Genel arayüzler ve tür takma adları tanımlayın; kısıtlamalar ve varsayılanlar ekleyin ve her birinin hangi durumlarda öne çıktığını anlayın.

Genel arayüzler ve tür takma adları, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 3 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, TypeScript Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. TypeScript Academy kursu toplamda 3 dersten oluşur.

Giriş

Amaç: Jenerik arayüzler ve tür takma adları kullanarak yeniden kullanılabilir yapılar oluşturun. Kısıtlamalar ve varsayılanlar ekleyecek, aralarındaki temel farkları öğreneceksiniz.

Ders özeti

Amaç: coroutineScope ile yapılandırılmış eşzamanlılığı uygulamak, istisna yayılımını anlamak ve iptal araçlarını güvenle kullanmak.

Temel fikirler

  • coroutineScope tüm alt görevleri bekler; başarısızlık kardeş görevleri iptal eder.
  • launch kapsam içinde hemen başarısız olur; async hataları await() çağrısında ortaya çıkarır.
  • withTimeout, bir sınır aşıldıktan sonra çalışmayı iptal eder.
  • İstisnaları ele almak için kapsamları try/catch ile sarın.

Jenerik arayüz

Bir jenerik arayüz bir tür parametresi içerir. Çağrı yapan kod, somut türleri yerine koyar (ör. Box<number>).

interface Box<T> {
  value: T;
}

const nBox: Box<number> = { value: 42 };
const sBox: Box<string> = { value: "ts" };
console.log(nBox.value, sBox.value);

Jenerik tür takma adı

Bir tür takma adı da jenerik olabilir ve nesneleri, işlevleri, birleşimleri veya kesişimleri ifade edebilir.

type Pair<A, B> = { first: A; second: B };

const p1: Pair<number, string> = { first: 1, second: "one" };
const p2: Pair<boolean, boolean> = { first: true, second: false };
console.log(p1, p2);

Kapsamın bekleme davranışı

coroutineScope, yalnızca alt görevleri tamamlandıktan sonra tamamlanan bir alt kapsam oluşturur.

import kotlinx.coroutines.*

suspend fun doTwoTasks(): Unit = coroutineScope {
    // Both run concurrently and the scope waits for them
    launch { delay(150); println("Task A done") }
    launch { delay(100); println("Task B done") }
    // returning Unit implicitly after children complete
}

fun main() = runBlocking {
    doTwoTasks()
    println("Scope completed")
}

Başarısızlık kardeş görevleri iptal eder

Bir alt görev hata fırlatırsa kapsam kardeş görevleri iptal eder ve hatayı çağırana yeniden fırlatır; çağrı noktasında try/catch kullanın.

import kotlinx.coroutines.*

suspend fun failingGroup() = coroutineScope {
    val a = launch {
        try {
            repeat(5) { i ->
                println("A $i"); delay(60)
            }
        } finally {
            println("A cancelled")
        }
    }
    launch {
        delay(120)
        throw IllegalStateException("boom") // failure in child
    }
    a.join() // will be cancelled when sibling fails
}

fun main() = runBlocking {
    try {
        failingGroup()
    } catch (e: Exception) {
        println("Caught in caller: ${e.message}")
    }
    println("Caller continues")
}

Kısıtlamalar

T'nin arayüz yöntemlerine gerekli üyeleri sunması için bir extends kısıtlaması ekleyin (ör. id).

interface Repository<T extends { id: number }> {
  getById(id: number): T | undefined;
  save(entity: T): void;
}

type User = { id: number; name: string };

const memRepo: Repository<User> = {
  store: [] as User[],
  getById(id) {
    return this.store.find(u => u.id === id);
  },
  save(u) {
    this.store.push(u);
  }
} as unknown as Repository<User>;

memRepo.save({ id: 1, name: "Ada" });
console.log(memRepo.getById(1));

async ve await hataları

async istisnaları, await() çağrıldığında ortaya çıkar; bunları try/catch ile ele alın.

import kotlinx.coroutines.*

suspend fun parseAsync(s: String) = coroutineScope {
    val deferred = async {
        delay(50)
        s.toInt() // may throw NumberFormatException
    }
    try {
        println("Result = ${deferred.await()}") // error appears here
    } catch (e: NumberFormatException) {
        println("Handled parse error: ${e::class.simpleName}")
    }
}

fun main() = runBlocking {
    parseAsync("12")
    parseAsync("xx")
}

Varsayılanlar ve genişletme

Kullanım kolaylığı için varsayılan tür parametreleri sağlayın ve yardımcı türlerle türlerin üzerine kurun (ör. Readonly<Box<T>>).

interface ApiResponse<T = unknown> {
  data: T;
  ok: boolean;
}

type ReadonlyBox<T> = Readonly<Box<T>>;

const r1: ApiResponse = { data: "ok", ok: true };      // T defaults to unknown
const r2: ApiResponse<number> = { data: 200, ok: true };
const rb: ReadonlyBox<string> = { value: "fixed" };
// rb.value = "change"; // Error: readonly

withTimeout ile iptal

Çalışmayı sınırlandırmak için withTimeout kullanın; bu, alt görevi iptal eder ve TimeoutCancellationException fırlatır.

import kotlinx.coroutines.*

suspend fun slowOp(): Int {
    delay(300) // pretend work
    return 42
}

fun main() = runBlocking {
    try {
        val result = withTimeout(150) { slowOp() } // cancels after 150ms
        println("Got $result")
    } catch (e: TimeoutCancellationException) {
        println("Timed out and cancelled")
    }
}

Birleştirme farkları

Arayüzler, bildirim birleştirmeyi destekler. Tür takma adları birleştirilemez; yinelenen adlar hatadır.

interface Settings { theme: string }
interface Settings { lang: string }
// Merged: Settings has { theme: string; lang: string }
const s: Settings = { theme: "dark", lang: "en" };

// type Settings = { foo: string };
// Error: Duplicate identifier 'Settings' for type aliases (no merging)

Yapılandırılmış eşzamanlılıkta başarısızlık kuralı

coroutineScope içinde bir alt coroutine istisnayla başarısız olursa ne olur?

Arayüzler ve türler kontrolü

Hızlı kontrol: Jenerik arayüzler ile tür takma adları hakkında TRUE olan ifade hangisidir?

Özet

Özet: Yeniden kullanılabilir yapıları modellemek için jenerik arayüzleri ve tür takma adlarını kullanın. Kısıtlamalar ve varsayılanlar ekleyin; yalnızca arayüzlerin birleştirilebildiğini unutmayın.

Özet

Özet: Çalışmaları gruplamak için coroutineScope kullanın; başarısız olan bir alt görev kardeş görevleri iptal eder. Hataları try/catch ile ele alın, async başarısızlıklarını await() çağrısında ortaya çıkarın ve uzun görevleri withTimeout ile iptal edin.

Sıkça Sorulan Sorular

“Genel arayüzler ve tür takma adları” dersi ücretsiz mi?

Evet — “Genel arayüzler ve tür takma adları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve TypeScript Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. TypeScript Academy kursu toplamda 3 dersten oluşur.

“Genel arayüzler ve tür takma adları” dersinde ne öğreneceğim?

Genel arayüzler ve tür takma adları tanımlayın; kısıtlamalar ve varsayılanlar ekleyin ve her birinin hangi durumlarda öne çıktığını anlayın. TypeScript Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

TypeScript Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te TypeScript Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 1. dersidir.

“Genel arayüzler ve tür takma adları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu TypeScript Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her TypeScript Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Genel arayüzler ve tür takma adları
  2. Koşullu türler (giriş) ve birleşimler üzerinde dağılım
  3. Veri modelleri için yeniden kullanılabilir kalıplar
← TypeScript Academy Sayfasına Dön