TypeScript utility type 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 modeled 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