Hone logo
Hone
Problems

Creating a Mutable Helper Object in TypeScript

This challenge focuses on creating a TypeScript helper object that allows for mutable updates to its properties while maintaining type safety. Often, you need to manage a set of configuration options or state that needs to be modified throughout your application, and a mutable helper object provides a clean and type-safe way to do so. This is particularly useful when dealing with complex data structures where immutability can become cumbersome.

Problem Description

You are tasked with creating a TypeScript class called MutableHelper. This class should be initialized with an initial object of any type T. The class should provide a method called update that accepts a partial object of type Partial<T> and merges it with the internal state of the MutableHelper. The update method should modify the internal state directly (mutably) and return the updated object. The class should also have a method called get that returns a copy of the current internal state.

Key Requirements:

  • Type Safety: The MutableHelper should be strongly typed based on the initial object provided during instantiation.
  • Mutable Updates: The update method should modify the internal state directly.
  • Partial Updates: The update method should accept a Partial<T> object, allowing for selective updates to only specific properties.
  • Copy on Get: The get method should return a copy of the internal state, not a reference to the internal state itself. This prevents external code from directly mutating the internal state.

Expected Behavior:

  • Instantiating MutableHelper with an object of type MyType should result in a MutableHelper instance that is also typed as MyType.
  • Calling update with a Partial<MyType> object should merge the provided updates into the internal state.
  • Calling get should return a new object with the same properties and values as the current internal state.

Edge Cases to Consider:

  • What happens if update is called with properties that don't exist in the initial object? (They should be added.)
  • What happens if update is called with properties that already exist in the initial object but with a different type? (This should ideally be handled gracefully, potentially with a type error or a runtime warning, but the primary focus is on correct merging.)
  • Ensure the get method always returns a new object, even if the internal state hasn't changed.

Examples

Example 1:

Input:
const initial = { name: "Alice", age: 30 };
const helper = new MutableHelper(initial);

helper.update({ age: 31 });

Output:
{ name: "Alice", age: 31 }
Explanation: The `age` property was updated from 30 to 31.

Example 2:

Input:
const initial = { name: "Bob", city: "New York" };
const helper = new MutableHelper(initial);

helper.update({ country: "USA", name: "Charlie" });

Output:
{ name: "Charlie", city: "New York", country: "USA" }
Explanation: The `name` property was updated, and a new `country` property was added.

Example 3: (Edge Case)

Input:
const initial = { x: 10, y: 20 };
const helper = new MutableHelper(initial);

const updated = helper.update({ z: 30 });
const finalState = helper.get();

Output:
updated: { x: 10, y: 20, z: 30 }
finalState: { x: 10, y: 20, z: 30 }
Explanation: A new property `z` was added to the internal state.  `get` returns a copy.

Constraints

  • The initial object T can be of any type.
  • The update method should be efficient for reasonably sized objects (e.g., up to 100 properties). Deep cloning is not required.
  • The get method must return a new object, not a reference to the internal state.
  • The code should be well-structured and readable.

Notes

  • Consider using the spread operator (...) for merging objects.
  • The Partial<T> utility type is essential for type safety when updating properties.
  • Think carefully about how to ensure that get returns a copy of the internal state. Simply returning the internal state directly will defeat the purpose of the helper.
  • While handling type mismatches in update is a bonus, the primary focus is on correct merging and type safety based on the initial object.
Loading editor...
typescript