Hone logo
Hone
Problems

Type-Level Fibonacci Sequence in TypeScript

Calculating Fibonacci numbers is a classic programming exercise. This challenge asks you to implement a Fibonacci sequence generator at the type level in TypeScript. This means you'll be using TypeScript's advanced type system to define and compute Fibonacci numbers as types, rather than as runtime values.

Problem Description

The goal is to create a TypeScript type Fibonacci<N> that represents the Nth Fibonacci number. The Fibonacci sequence starts with 0 and 1, and each subsequent number is the sum of the two preceding ones (e.g., 0, 1, 1, 2, 3, 5, 8...). You must achieve this purely through type-level computations, leveraging conditional types and potentially recursive type definitions. The type Fibonacci<N> should resolve to a type representing the Nth Fibonacci number.

Key Requirements:

  • Type-Level Computation: The solution must be entirely type-level. No runtime calculations are allowed.
  • Recursive Definition: The Fibonacci sequence is inherently recursive, so your type definition should reflect this.
  • Base Cases: Handle the base cases of the Fibonacci sequence (F(0) = 0, F(1) = 1) correctly.
  • Generality: The solution should work for any non-negative integer N.

Expected Behavior:

  • Fibonacci<0> should resolve to the type 0.
  • Fibonacci<1> should resolve to the type 1.
  • Fibonacci<2> should resolve to the type 1.
  • Fibonacci<3> should resolve to the type 2.
  • Fibonacci<4> should resolve to the type 3.
  • Fibonacci<5> should resolve to the type 5.
  • And so on...

Edge Cases to Consider:

  • N being 0 or 1 (base cases).
  • Larger values of N – while TypeScript's type system can handle reasonably large numbers, extremely large values might lead to type checking errors due to complexity. The focus is on the approach rather than handling arbitrarily large numbers.

Examples

Example 1:

// Expected: type Fibonacci<0> = 0;

Example 2:

// Expected: type Fibonacci<1> = 1;

Example 3:

// Expected: type Fibonacci<5> = 5;

Example 4:

// Expected: type Fibonacci<10> = 55;

Constraints

  • Input Type: N must be a number represented as a type (e.g., Fibonacci<0>, Fibonacci<5>).
  • Type Safety: The solution must be type-safe and avoid any type errors.
  • Readability: While conciseness is appreciated, the code should be reasonably readable and understandable. Comments explaining the logic are encouraged.
  • Performance (Type-Level): While "performance" isn't directly measurable in type-level code, avoid unnecessarily complex or deeply nested type definitions that could significantly increase type checking time. The goal is a reasonably efficient type-level computation.

Notes

  • TypeScript's conditional types (A extends B ? C : D) are crucial for this problem.
  • Recursive type definitions are necessary to implement the Fibonacci sequence's recursive nature.
  • Consider using a helper type to represent the "sum" of two numbers at the type level. This might involve using union types or other techniques to combine types.
  • Think about how to represent the base cases (0 and 1) as types.
  • This is a challenging problem that requires a good understanding of TypeScript's advanced type system. Don't be afraid to experiment and iterate on your solution.
Loading editor...
typescript