Hone logo
Hone
Problems

Type-Level Multiplication in TypeScript

This challenge focuses on leveraging TypeScript's advanced type system to perform mathematical operations at compile time. You will create a type that can multiply two non-negative integer literal types, returning a new type representing their product. This exercise is valuable for understanding the expressive power of TypeScript's conditional types and recursive type definitions.

Problem Description

Your goal is to define a TypeScript type Multiply<A, B> that takes two non-negative integer literal types, A and B, and resolves to a new type representing their product A * B.

Key Requirements:

  • The type Multiply<A, B> should correctly calculate the product for any non-negative integer literal types A and B.
  • The implementation should be purely within TypeScript's type system, without relying on runtime JavaScript code.
  • Consider how to handle the base cases and recursive steps involved in multiplication.

Expected Behavior:

type Result = Multiply<5, 3>; // Should resolve to type 15
type AnotherResult = Multiply<0, 10>; // Should resolve to type 0
type YetAnother = Multiply<7, 0>; // Should resolve to type 0
type LargeNumbers = Multiply<10, 12>; // Should resolve to type 120

Edge Cases:

  • Multiplication by zero.

Examples

Example 1:

Input: Multiply<4, 2>
Output: 8
Explanation: The type 4 multiplied by the type 2 should result in the type 8.

Example 2:

Input: Multiply<6, 0>
Output: 0
Explanation: Multiplying any number by zero results in zero.

Example 3:

Input: Multiply<0, 5>
Output: 0
Explanation: Similarly, multiplying zero by any number results in zero.

Constraints

  • Inputs A and B will be non-negative integer literal types (e.g., 0, 1, 5, 100).
  • The resulting product should also be representable as a non-negative integer literal type.
  • Avoid using any external libraries or runtime JavaScript functions.

Notes

Think about how multiplication can be defined recursively. For example, A * B can be thought of as adding A to itself B times. You will likely need to represent numbers using a technique like tuple lengths or by defining a helper type that can increment numbers. Consider the base case where one of the numbers is zero.

Loading editor...
typescript