Recursiediepte en limieten
Begrijp de beperkingen van de recursiediepte in TypeScript
Recursiediepte en limieten is een gratis TypeScript Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject TypeScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus TypeScript Academy bevat in totaal 4 lessen.
TypeScript heeft recursielimieten
Recursieve typen zijn krachtig, maar de typechecker beperkt hoe diep hij ze kan instantiëren. Als je de limiet bereikt, krijg je een dieptefout.
// Excessively deep recursive types can produce:
// "Type instantiation is excessively deep and possibly infinite."Waar dieptefouten vandaan komen
Conditionele typen die recursief zijn zonder een duidelijk, steeds kleiner basisgeval kunnen ontsporen, vooral in combinatie met grote unies of het opbouwen van tuples.
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>;Veilige begrensde recursie
Houd recursie ondiep en begrensd. Een kleine tuple opbouwen is prima; het basisgeval Acc["length"] extends N stopt de recursie snel.
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);Patronen voor staartrecursieve typen
TypeScript optimaliseert bepaalde staartrecursieve conditionele typen door een accumulator mee te geven, waardoor diepere recursie mogelijk is dan bij naïeve nesting.
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);Waarom accumulators helpen
Door resultaten door te geven in een accumulator blijft de recursie in de staartpositie, waardoor TypeScript deze efficiënter kan uitrollen dan diep geneste conditionele typen.
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);Niet-staartrecursie vermijden
Als je de recursieve aanroep in een andere typebewerking verpakt, verlaat je de staartpositie en kun je sneller de limieten bereiken. Geef de toestand in plaats daarvan mee in een accumulator.
// 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");De diepte expliciet begrenzen
Voeg een diepteteller toe, zodat het type na een vast aantal niveaus stopt. Je ruilt volledigheid in voor gegarandeerde beëindiging.
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);Praktische dieptes zijn meestal geen probleem
Alledaagse recursieve typen, gekoppelde lijsten, bomen en JSON bereiken de limiet nooit, omdat de gegevens waarop je het type toepast ondiep zijn. De limieten hebben vooral invloed op zware berekeningen op typeniveau.
type Json = string | number | boolean | null | Json[] | { [k: string]: Json };
const v: Json = { a: { b: { c: 1 } } }; // fine, shallow
console.log(v);De foutmelding herkennen
Wanneer je "excessively deep and possibly infinite" ziet, zoek dan naar een ontbrekend basisgeval, een accumulator in een niet-staartpositie of invoer die te groot is.
// 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");Runtime-recursie staat los hiervan
Deze limieten gaan over recursie op typeniveau. Gewone recursieve functies voor recursieve typen worden tijdens runtime uitgevoerd en worden alleen begrensd door de aanroepstack.
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: [] }] }));Ontwerpen binnen de limieten
Geef de voorkeur aan ondiepe gegevens, staartrecursieve patronen met accumulators en expliciete dieptelimieten. Met deze gewoonten kom je in echte code zelden bij de limiet.
type Length<T extends unknown[]> = T["length"];
type N = Length<[1, 2, 3]>; // 3
const n: N = 3;
console.log(n);Snelle toets: recursielimieten
Toets je begrip van recursiediepte en limieten.
Herhaling: recursiediepte en limieten
Je leerde dat TypeScript de recursiediepte op typeniveau begrenst, dat staartrecursieve patronen met accumulators en expliciete dieptelimieten helpen en dat alledaagse recursieve gegevens de limiet zelden bereiken.
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);Leer TypeScript met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 101
- Lessen
- 352
Veelgestelde vragen
Is de les “Recursiediepte en limieten” gratis?
Ja — de volledige tekst van “Recursiediepte en limieten” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus TypeScript Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus TypeScript Academy bevat in totaal 4 lessen.
Wat leer ik in “Recursiediepte en limieten”?
Begrijp de beperkingen van de recursiediepte in TypeScript Je oefent met TypeScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met TypeScript Academy te beginnen?
Ervaring vooraf is niet nodig. TypeScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Recursiediepte en limieten”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over TypeScript Academy?
Ja. Elke les over TypeScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Recursieve typedefinities
- Boomstructuren typen
- JSON-waardetypen
- Recursiediepte en limieten