再帰型の定義
自分自身を参照する型を安全に記述します。
「再帰型の定義」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
再帰型とは
再帰型とは、自身の定義内で自分自身を参照する型です。これにより、深さに上限のないデータ構造を記述できます。
type LinkedList<T> = {
value: T;
next: LinkedList<T> | null;
};
// next is the same type again, ending at null.連結リストの型
典型的な例では、各ノードが value と、別のノードを指す next ポインターを保持します。next が null の場合はチェーンの末尾です。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const list: LinkedList<number> = {
value: 1,
next: { value: 2, next: null }
};
console.log(list.value, list.next?.value);基底ケースが重要な理由
すべての再帰型には、再帰を終了させる終端が必要です。ここでは null が終端になります。これがなければ、型は無限に深くなります。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const single: LinkedList<string> = { value: "only", next: null };
console.log(single.next);より長いチェーンの構築
必要なだけ深くネストできます。next 自体がリストまたは null であるため、この型では任意の長さを表現できます。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const chain: LinkedList<number> = {
value: 10,
next: { value: 20, next: { value: 30, next: null } }
};
console.log(chain.next?.next?.value);連結リストの走査
関数は next をたどり、null に到達するまでチェーンを走査できます。再帰型によって、この処理は完全に型安全になります。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function toArray<T>(list: LinkedList<T> | null): T[] {
const out: T[] = [];
let cur = list;
while (cur) { out.push(cur.value); cur = cur.next; }
return out;
}
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(toArray(l));再帰型に対する再帰関数
再帰型は再帰関数と自然に組み合わせられます。ここでは next に対して再帰を行い、長さを計算します。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function length<T>(list: LinkedList<T> | null): number {
return list === null ? 0 : 1 + length(list.next);
}
const l: LinkedList<string> = { value: "a", next: { value: "b", next: null } };
console.log(length(l));リストの先頭への追加
型が一貫しているため、新しいリストの構築は簡単です。既存のリストを新しい先頭ノードの next としてラップします。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function prepend<T>(value: T, list: LinkedList<T> | null): LinkedList<T> {
return { value, next: list };
}
const l = prepend(1, prepend(2, null));
console.log(l.value, l.next?.value);省略可能な終端と null による終端
null で終端することも、next を省略可能にすることもできます。どちらも再帰を終了させます。末尾をどのように表現したいかに応じて選択してください。
type ListA<T> = { value: T; next: ListA<T> | null };
type ListB<T> = { value: T; next?: ListB<T> };
const a: ListA<number> = { value: 1, next: null };
const b: ListB<number> = { value: 1 };
console.log(a.value, b.value);再帰型は遅延評価されます
TypeScript は、実際に使用する範囲までしか再帰型を展開しません。そのため、定義が自分自身を参照していても、処理が無限に行われることはありません。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
// Using two levels only expands two levels.
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(l.next?.value);リストへのマッピング
再帰的なマップは各値を変換しながら構造を維持し、同じ形状の新しいリストを返します。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
function mapList<T, U>(list: LinkedList<T> | null, fn: (v: T) => U): LinkedList<U> | null {
if (list === null) return null;
return { value: fn(list.value), next: mapList(list.next, fn) };
}
const l: LinkedList<number> = { value: 1, next: { value: 2, next: null } };
console.log(mapList(l, x => x * 10)?.value);再帰型が強力な理由
自分自身を参照する型によって、任意の深さのネストしたデータ、リスト、ツリー、JSON を、完全な型安全性と設計上の固定された深さ制限なしでモデル化できます。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const l: LinkedList<boolean> = { value: true, next: { value: false, next: null } };
console.log(l.value, l.next?.value);理解度チェック:再帰型
再帰型の定義を理解できているか確認しましょう。
まとめ:再帰型の定義
再帰型は自分自身を参照し、null のような基底ケースで終了する必要があり、再帰関数と自然に組み合わせて連結リストの走査、マッピング、構築を行えることを学びました。
type LinkedList<T> = { value: T; next: LinkedList<T> | null };
const l: LinkedList<number> = { value: 1, next: null };
console.log(l.value);よくある質問
「再帰型の定義」レッスンは無料ですか?
はい。「再帰型の定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「再帰型の定義」で何を学びますか?
自分自身を参照する型を安全に記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「再帰型の定義」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。