0Pricing
TypeScript Academy · Ders

Özyineleme Derinliği ve Sınırları

TypeScript'in özyineleme derinliği kısıtlarını anlayın.

Özyineleme Derinliği ve Sınırları, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 4 dersinin 4. 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 4 dersten oluşur.

TypeScript'in Özyineleme Sınırları Vardır

Özyinelemeli türler güçlüdür; ancak tür denetleyicisi bunları ne kadar derinlemesine somutlaştıracağını sınırlar. Sınıra ulaşırsanız derinlik hatası alırsınız.

// Excessively deep recursive types can produce:
// "Type instantiation is excessively deep and possibly infinite."

Derinlik Hataları Nereden Kaynaklanır?

Açıkça küçülen bir temel durumu olmadan özyineleyen koşullu türler, özellikle büyük birleşimlerle veya demet oluşturmayla birleştirildiğinde kontrolden çıkabilir.

type Repeat<N extends number, Acc extends unknown[] = []> =
  Acc["length"] extends N ? Acc : Repeat<N, [...Acc, unknown]>;
// Large N can exceed the instantiation depth.
type Five = Repeat<5>;

Güvenli, Sınırlandırılmış Özyineleme

Özyinelemeyi sığ ve sınırlandırılmış tutun. Küçük bir demet oluşturmak uygundur; Acc["length"] extends N temel durumu özyinelemeyi hemen durdurur.

type Tuple<N extends number, Acc extends unknown[] = []> =
  Acc["length"] extends N ? Acc : Tuple<N, [...Acc, unknown]>;
type Three = Tuple<3>; // [unknown, unknown, unknown]
const t: Three = [1, 2, 3];
console.log(t.length);

Kuyruk Özyinelemeli Tür Kalıpları

TypeScript, biriktirici taşıyan belirli kuyruk özyinelemeli koşullu türleri iyileştirir; böylece naif iç içe yapılandırmaya göre daha derin özyinelemeye izin verir.

type Reverse<T extends unknown[], Acc extends unknown[] = []> =
  T extends [infer Head, ...infer Tail]
    ? Reverse<Tail, [Head, ...Acc]>
    : Acc;
type R = Reverse<[1, 2, 3]>; // [3, 2, 1]
const r: R = [3, 2, 1];
console.log(r);

Biriktiriciler Neden Yardımcı Olur?

Sonuçları biriktiricide ileriye aktarmak, özyinelemeyi kuyruk konumunda tutar; TypeScript bunu derin iç içe koşullu türlerden daha verimli şekilde açabilir.

type Join<T extends string[], Acc extends string = ""> =
  T extends [infer H extends string, ...infer R extends string[]]
    ? Join<R, Acc extends "" ? H : Acc>
    : Acc;
type First = Join<["a", "b", "c"]>; // "a"
const f: First = "a";
console.log(f);

Kuyruk Özyinelemeli Olmayan Özyinelemeden Kaçınma

Özyinelemeli çağrıyı başka bir tür işleminin içine sarmak kuyruk konumunu bozar ve sınırlara daha erken ulaşılmasına neden olabilir. Bunun yerine durumu bir biriktiricide taşımayı tercih edin.

// Non-tail (can be costly): builds nesting around the recursive call
// type Bad<T> = T extends [infer H, ...infer R] ? [H, ...Bad<R>] : [];
// Tail-friendly alternative uses an accumulator parameter.
console.log("prefer accumulators");

Derinliği Açıkça Sınırlandırma

Sabit sayıda düzeyden sonra türün durmasını sağlayacak bir derinlik sayacı ekleyin; böylece eksiksizliği, kesin sonlanma güvencesiyle değiş tokuş edersiniz.

type Flatten<T, Depth extends unknown[] = []> =
  Depth["length"] extends 5
    ? T
    : T extends (infer U)[]
      ? Flatten<U, [...Depth, unknown]>
      : T;
type X = Flatten<number[][]>; // number
const x: X = 7;
console.log(x);

Pratik Derinlik Genellikle Sorun Değildir

Günlük özyinelemeli türler, bağlı listeler, ağaçlar ve JSON, somutlaştırdığınız veriler sığ olduğu için sınıra hiçbir zaman ulaşmaz. Sınırlar esas olarak ağır tür düzeyi hesaplamalarını etkiler.

type Json = string | number | boolean | null | Json[] | { [k: string]: Json };
const v: Json = { a: { b: { c: 1 } } }; // fine, shallow
console.log(v);

Hata Mesajını Tanıma

"excessively deep and possibly infinite" ifadesini gördüğünüzde eksik bir temel durumu, kuyruk konumunda olmayan bir biriktirici veya çok büyük bir girdi arayın.

// Fixes: add/tighten the base case, switch to tail recursion,
// reduce input size, or cap with a depth counter.
console.log("check base case and tail position");

Çalışma Zamanı Özyinelemesi Ayrıdır

Bu sınırlar tür düzeyi özyinelemeyle ilgilidir. Özyinelemeli türler üzerindeki sıradan özyinelemeli işlevler çalışma zamanında çalışır ve yalnızca çağrı yığını tarafından sınırlandırılır.

type TreeNode<T> = { value: T; children: TreeNode<T>[] };
function count<T>(n: TreeNode<T>): number {
  return 1 + n.children.reduce((a, c) => a + count(c), 0);
}
console.log(count({ value: 1, children: [{ value: 2, children: [] }] }));

Sınırlar Dahilinde Tasarlama

Sığ verileri, biriktiricili kuyruk özyinelemeli kalıpları ve açık derinlik sınırlarını tercih edin. Bu alışkanlıklarla gerçek kodlarda sınıra nadiren ulaşırsınız.

type Length<T extends unknown[]> = T["length"];
type N = Length<[1, 2, 3]>; // 3
const n: N = 3;
console.log(n);

Hızlı Kontrol: Özyineleme Sınırları

Özyineleme derinliği ve sınırları konusundaki anlayışınızı sınayın.

Özet: Özyineleme Derinliği ve Sınırları

TypeScript'in tür düzeyi özyineleme derinliğini sınırlandırdığını, biriktiricili kuyruk özyinelemeli kalıpların ve açık derinlik sınırlarının yardımcı olduğunu, günlük özyinelemeli verilerin ise nadiren sınıra ulaştığını öğrendiniz.

type Reverse<T extends unknown[], Acc extends unknown[] = []> =
  T extends [infer H, ...infer R] ? Reverse<R, [H, ...Acc]> : Acc;
const r: Reverse<[1, 2]> = [2, 1];
console.log(r);

Sıkça Sorulan Sorular

“Özyineleme Derinliği ve Sınırları” dersi ücretsiz mi?

Evet — “Özyineleme Derinliği ve Sınırları” 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 4 dersten oluşur.

“Özyineleme Derinliği ve Sınırları” dersinde ne öğreneceğim?

TypeScript'in özyineleme derinliği kısıtları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, 4 dersinin 4. dersidir.

“Özyineleme Derinliği ve Sınırları” 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. Özyinelemeli Tür Tanımları
  2. Ağaç Yapılarının Türünü Belirleme
  3. JSON Değer Türleri
  4. Özyineleme Derinliği ve Sınırları
← TypeScript Academy Sayfasına Dön