TypeScript utility type in order to ensure to return only properties (not methods) containing values in primitive types such as number or boolean (not Value Objects).
Take a look, play and have fun with this.
Stars are welcome 😊
You can have a domain entity such as the following Course:
import { CourseId } from "./CourseId";
import { CourseTitle } from "./CourseTitle";
export class Course {
constructor(public courseId: CourseId, public courseTitle: CourseTitle) {}
updateTitle(newCourseTitle: CourseTitle): void {
this.courseTitle = newCourseTitle;
}
someOtherMethodWithDomainLogic(): void {
// some algorithm
}
}When we want to have a toPrimitives method in order to pass an instance of the Course class between architectural layers, so the thing we want pass around should be to serialized/marshalled in a way that only containings primitive values such as:
{
"courseId": "25658f31-2da1-4942-8b58-88aeacc79860",
"courseTitle": "🚜 TypeScript Avanzado: Más allá de any"
}That is:
- We want to avoid including methods such as the
thisFunctionShouldNotBeIncludedInTheToPrimitivesone, so the transformation should only include properties. - We want to flatten or unwrap encapsulated properties such as the
courseIdandcourseTitleones. They are modelled as Value Objects (CourseIdandCourseTitleclasses), so the transformation or flatten should only include properties in a recursive manner.
That is exactly what our Primitives<T> utility type guarantees. Let's add it! 💪
import { Primitives } from "@codelytv/primitives-type";
import { CourseId } from "./CourseId";
import { CourseTitle } from "./CourseTitle";
export class Course {
constructor(public courseId: CourseId, public courseTitle: CourseTitle) {}
updateTitle(newCourseTitle: CourseTitle): void {
this.courseTitle = newCourseTitle;
}
someOtherMethodWithDomainLogic(): void {
// some algorithm
}
toPrimitives(): Primitives<Course> {
return {
courseId: this.courseId.value,
courseTitle: this.courseTitle.value,
};
}
}Done! ✌️
The Primitives<Course> return type is ensuring all our restrictions in a very straightforward way! 🌈
- Npm:
npm install --save-dev @codelytv/primitives-type - Yarn:
yarn add -D @codelytv/primitives-type
Publishing this package we are committing ourselves to the following code quality standards:
- 🤝 Respect Semantic Versioning: No breaking changes in patch or minor versions
- 🤏 No surprises in transitive dependencies: Use the bare minimum dependencies needed to meet the purpose
- 🎯 One specific purpose to meet without having to carry a bunch of unnecessary other utilities
- ✅ Tests as documentation and usage examples
- 📖 Well documented ReadMe showing how to install and use
- ⚖️ License favoring Open Source and collaboration
- 🚜 TypeScript Avanzado: Más allá de any (Spanish - Course)
- 📂 DDD en TypeScript: Estructura de carpetas (Spanish - YouTube video)
- 🔖 Domain-Driven Design en TypeScript (Spanish - Course)
- 🐥 JavaScript moderno: Buenas prácticas para empezar y refactorizar aplicaciones (Spanish - Course)
- 🏗️ De JavaScript a TypeScript (Spanish - Course)
- 🌱 TypeScript Basic Skeleton: Bootstrap your new TypeScript frontend project
- 🌍 TypeScript API Skeleton: Bootstrap your new TypeScript backend project
- ✨ TypeScript DDD Skeleton: Bootstrap your new TypeScript projects applying Hexagonal Architecture and Domain-Driven Design patterns
- 🔖 TypeScript DDD Course: Learn Domain-Driven Design in TS lesson by lesson
- 🎯 TypeScript DDD Example: Complete project applying Hexagonal Architecture and Domain-Driven Design patterns