Güçlü türlere sahip oluşturucular
Türleri belirlenmiş seçenekleri biriktiren zincirlenebilir oluşturucular tasarlayın; geneller ve koşullu türlerle gerekli adımları ve geçerli birleşimleri güvenceye alın.
Güçlü türlere sahip oluşturucular, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 3 dersinin 3. 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ç: İlerlemeyi türde kodlayan zincirlenebilir API'ler oluşturun. Her adım yeni bir tür bilgili durum döndürür; böylece geçersiz sıralamalar derleme zamanında başarısız olur.
- Seçenekleri genel bir türde biriktirin
- Adımları işaretlerle sınırlandırın
- DX'i basit tutun
Durum işaretleri
Her adım yeni bir durum türü döndürür; build yalnızca gerekli işaretler doğru olduğunda kullanılabilir.
type Flags = { method: boolean; url: boolean }
type With<F extends Partial<Flags>> = { flags: F }
type True = true
type Builder<F extends Partial<Flags>, O extends Record<string, unknown>> = With<F> & {
method<M extends "GET" | "POST">(m: M): Builder<F & { method: True }, O & { method: M }>
url<U extends `/${string}`>(u: U): Builder<F & { url: True }, O & { url: U }>
build(this: Builder<{ method: True; url: True }, any>): O
}
function createBuilder(): Builder<{}, {}> {
return {
flags: {},
method(m) { return { ...this, flags: { ...this.flags, method: true }, method: this.method, url: this.url, build: this.build } as any },
url(u) { return { ...this, flags: { ...this.flags, url: true }, method: this.method, url: this.url, build: this.build } as any },
build() { return this as any }
} as any
}
const b = createBuilder()
const good = b.method("GET").url("/users").build() // ok
// const bad = b.build() // error: build requires method & url flagsSeçenekleri biriktirme
Seçenekleri O genel türünde biriktirin; her çağrı yeni özellikler ekleyen bir tür döndürür.
type B2<F extends Partial<Flags>, O extends Record<string, unknown>> = With<F> & {
header<K extends string, V extends string>(k: K, v: V): B2<F, O & { headers: Record<K, V> }>
query<K extends string, V extends string>(k: K, v: V): B2<F, O & { query: Record<K, V> }>
method<M extends "GET" | "POST">(m: M): B2<F & { method: True }, O & { method: M }>
url<U extends `/${string}`>(u: U): B2<F & { url: True }, O & { url: U }>
build(this: B2<{ method: True; url: True }, any>): O
}
function builder2(): B2<{}, {}> { return {} as any }
const conf = builder2()
.method("POST")
.url("/login")
.header("x-id", "42")
.query("next", "home")
.build()Geçerli birleşimler
Birleşimleri koşullu türlerle sınırlayın: body yalnızca POST için serbest olsun.
type Method = "GET" | "POST"
type BodyIfPost<M extends Method, B> = M extends "POST" ? { body: B } : {}
type B3<F extends Partial<Flags>, O extends Record<string, unknown>> = With<F> & {
method<M extends Method>(m: M): B3<F & { method: True }, O & { method: M }>
url<U extends `/${string}`>(u: U): B3<F & { url: True }, O & { url: U }>
body<B>(b: B & (O extends { method: "POST" } ? unknown : never)): B3<F, O & BodyIfPost<O extends { method: infer M } ? Extract<M, Method> : Method, B>>
build(this: B3<{ method: True; url: True }, any>): O
}
function builder3(): B3<{}, {}> { return {} as any }
const ok = builder3().method("POST").url("/u").body({ a: 1 }).build()
// const badBody = builder3().method("GET").url("/u").body({ a: 1 }).build() // compile-time errorDeğişken uzunluklu işlem hattı
Adımları değişken uzunluklu bir demet dizisiyle koleksiyon olarak toplayın; giriş ve çıkışı Parameters/ReturnType ile yönetin.
type Step<A extends any[], R> = (...args: A) => R
type Pipeline<P extends Step<any, any>[]> = {
use<S extends Step<any, any>>(...s: [S]): Pipeline<[...P, S]>
run<A extends Parameters<P[0]>>(this: Pipeline<P>, ...args: A): ReturnType<P[number]>
}
function pipeMake(): Pipeline<[]> { return {} as any }
const pipe = pipeMake()
.use((a: string) => a.length)
.use((n: number) => n % 2 === 0)
// pipe.run("abc") // demo; implementation omittedİpuçları
İpuçları:
Durumu hayali bir genel tür olarak tutun; çalışma zamanına yük bindirmeyin.
Adım adlarını küçük ve sabit tutun (işlem, url).
Zor birleşimleri koşullu türlerle ayırın; zinciri temiz tutun.
Oluşturucu geçit kontrolü
Hızlı kontrol: İşlem adımının .build() çağrısından önce çağrılmasını nasıl sağlarız?
Özet
Özet: Tür bilgisi taşıyan durumu zincir boyunca aktardınız, seçenekleri genel türlerde biriktirdiniz ve geçersiz sıralamaları derleme zamanında yakaladınız.
Sıkça Sorulan Sorular
“Güçlü türlere sahip oluşturucular” dersi ücretsiz mi?
Evet — “Güçlü türlere sahip oluşturucular” 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.
“Güçlü türlere sahip oluşturucular” dersinde ne öğreneceğim?
Türleri belirlenmiş seçenekleri biriktiren zincirlenebilir oluşturucular tasarlayın; geneller ve koşullu türlerle gerekli adımları ve geçerli birleşimleri güvenceye alı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 3. dersidir.
“Güçlü türlere sahip oluşturucular” 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
- Demetlerde rest öğeleri, curry türleri
- Fonksiyonları ve bağımsız değişkenleri güvenle birleştirme
- Güçlü türlere sahip oluşturucular