Разглеждах проекта с отворен код Novu. Той следва DDD модел за развитие. Там видях общия DDD модел с внедряване на команди и случаи на използване върху услугата NestJS.

Командването в разработката, управлявана от домейн, е основно като DTO (прост клас в термина за непрофесионалисти). Видях, че всяка команда следва модела ClassName.create() за създаване на нов клас, вместо да използва конструктори.

Методът за статично създаване в командата обработи всички проверки. Така че беше логично да направя конструктора незаконен за използване, което ме накара да внедря нещо подобно в машинопис.

С прости думи, кодът по-долу трябва да направи конструктора незаконен за използване в нивото на типа. Принуждаване на потребителите да използват вместо това метода ClassName.create().

Можем също да го направим асинхронен.

// Happy Nepali New Year 2080 guys 🇳🇵


// this is me mocking a database repository level 
const carsDb = {
  exists:async (id:string)=>Promise.resolve(false),
  getUser: async(id:string)=>Promise.resolve({
    "name":"Nirjal Paudel"
  })
}



/*
Lets say you have a use case, where
you want to instaniate an object if and 
only if your some asynchronous API call works
*/
class Car{  
  id: string;

  // I am lazy to make types here hehe
  user: any; 
  
  // This will make constuctor illegal to use in type level
  private constructor(id:string){
    this.id = id
  }
  
  static async createCar(id:string){
    // some asyncronous business logic here
    // lets say you create check an API here to find out
    // if car by the id exists or not already,
    const carExists = await carsDb.exists(id);
    if (!carExists) throw new Error("Cannot create Car");
    const carObj = new Car(id);
    // some wrapping around car -> lets say
    carObj.user = await carsDb.getUser(id);
    return carObj;
  }

  
}

// should give type error
const car1 = new Car("car1-id");
const car2 = new Car()

// works as an asynchronous constructor
const car2 = await Car.createCar("car2-id");


// making it modular to support top level await
export {}

Novu: https://github.com/novuhq/novu

#разработка с отворен код