Hone logo
Hone
Problems

Dynamorphic Types in TypeScript: The Shape Shifter

Dynamorphisms, inspired by functional programming concepts, allow a type to represent multiple, potentially unrelated, shapes. This is incredibly useful for handling data with varying structures, such as parsing JSON responses where the schema isn't known beforehand, or working with data from different sources that have inconsistent formats. This challenge will guide you in creating a basic dynamorphism in TypeScript to represent different data shapes.

Problem Description

You need to create a TypeScript type called Dynamorphic that can represent either a string, a number, or an object with a single property named data. The data property of the object can be either a string or a number. Essentially, Dynamorphic should be able to hold any of these three types: string, number, or { data: string | number }.

Your task is to define the Dynamorphic type and then create a function processDynamorphic that accepts a Dynamorphic value and returns a string. The function should behave as follows:

  • If the input is a string, return the string itself.
  • If the input is a number, convert the number to a string and return it.
  • If the input is an object with a data property, return the string representation of the data property (convert to string if it's a number).

Examples

Example 1:

Input: "hello"
Output: "hello"
Explanation: The input is a string, so we return it directly.

Example 2:

Input: 123
Output: "123"
Explanation: The input is a number, so we convert it to a string.

Example 3:

Input: { data: 456 }
Output: "456"
Explanation: The input is an object with a 'data' property (a number), so we convert the number to a string.

Example 4:

Input: { data: "world" }
Output: "world"
Explanation: The input is an object with a 'data' property (a string), so we return the string directly.

Constraints

  • The Dynamorphic type must accurately represent the three possible shapes: string, number, and { data: string | number }.
  • The processDynamorphic function must handle all three shapes correctly.
  • The processDynamorphic function must return a string in all cases.
  • No external libraries are allowed.

Notes

  • TypeScript's type system is key to solving this problem. Consider using union types and type guards to define the Dynamorphic type and implement the logic in processDynamorphic.
  • Type guards (using typeof or custom type predicates) will be essential for determining the shape of the input value.
  • Think about how to safely access the data property of the object type.
  • The goal is to demonstrate understanding of TypeScript's type system and how to work with union types and type guards to create a flexible and type-safe solution.
Loading editor...
typescript