¿Por qué?

El comando debería contener todo lo necesario para que el workflow pueda procesar la petición. Además de metadatos que permitan hacer un tracking del mismo. Hay metadatos que pueden ser fecha o similares que pueden ser compartidos por varios comandos distintos y para evitar repetición innecesaria se puede usar genéricas para solo crear cosas más específicas.

¿Cómo lo podemos hacer?

Definimos un tipo Command que contenga los campos comunes y un espacio para los datos específicos del comando (que llamaremos `Data).

algo así:

type Command<Data> = {
	data: Data
	timestamp: Date
	//more common fields
}

De esta manera podemos crear nuestros comandos así:

 
type​ UnvalidatedOrder = {
 ​  OrderId : ​string​,
   CustomerInfo : UnvalidatedCustomerInfo,
   ShippingAddress : ​UnvalidatedAddress​ 
}
 
 
type PlaceOrder = Command<UnvalidatedOrder>