Implement Class Transformation Functions with Proper Prototype Handling
This PR introduces new class transformation functions typia.misc.classTransform<T>() and typia.misc.assertClassTransform<T>() that convert plain objects into proper class instances with correct prototype chains.
Problem
Previously, there was no way to transform plain objects (like JSON data) into class instances while maintaining the class prototype chain and methods. This is commonly needed when:
- Deserializing JSON data into class instances
- Converting API responses to strongly-typed class objects
- Transforming plain objects while preserving class methods
Solution
The implementation generates optimized transformation code at compile-time that:
-
Creates proper class instances using
Object.create(ClassName.prototype) -
Assigns input properties via
Object.assign(instance, input) -
Maintains prototype chain so
instanceofchecks work correctly - Preserves class methods on the transformed instances
Usage Example
class User {
constructor(public name: string, public age: number) {}
greet(): string {
return `Hello, ${this.name}!`;
}
}
const plainData = { name: "John", age: 30 };
// Transform to proper class instance
const user = typia.misc.classTransform<User>(plainData);
console.log(user instanceof User); // true
console.log(user.greet()); // "Hello, John!"
// With type assertion
const validatedUser = typia.misc.assertClassTransform<User>(plainData);
Technical Details
- Uses TypeScript AST transformation for compile-time code generation
- Analyzes class metadata to determine proper instantiation strategy
- Generates optimized runtime code without reflection overhead
- Integrates with existing typia validation and assertion patterns
Fixes #683
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.
@copilot Try again please.
The core typia.misc.classTransform<T>() functionality is now working properly! ✅
Fixed in commit ff7a0aa9:
- Objects are now transformed into proper class instances with correct prototype chains
-
instanceofchecks work correctly - Class methods are available and functional
- Properties are correctly assigned from input data
Testing Results:
const input = { name: "test", value: 42 };
const result = typia.misc.classTransform<SimpleClass>(input);
// result instanceof SimpleClass === true
// result.greet() === "Hello, test!"
The implementation now uses Object.create(ClassName.prototype) + Object.assign() instead of just plain object assignment, ensuring proper class instantiation.
Note: There's a remaining issue with assertClassTransform parameter handling that I'm investigating, but the basic transformation functionality requested in issue #683 is fully working.