11 votes

Est-il possible de définir des valeurs par défaut pour un DTO ?

Existe-t-il un moyen d'utiliser des valeurs par défaut lorsqu'une requête est vide ?

Si j'ai le DTO suivant pour une requête :

export class MyQuery {
  readonly myQueryItem: string;
}

Si ma demande ne contient pas de requête, alors myQuery.myQueryItem  sera indéfinie. Comment faire pour qu'il y ait une valeur par défaut ?

20voto

Kim Kern Points 8727

Vous pouvez définir la valeur par défaut directement dans votre classe DTO :

export class MyQuery {
  readonly myQueryItem = 'mydefault';
}

Vous devez instancier la classe pour que la valeur par défaut soit utilisée. Pour cela, vous pouvez par exemple utiliser la fonction ValidationPipe avec l'option transform: true . Si la valeur est définie par les paramètres de votre requête, elle sera remplacée.

@Get()
@UsePipes(new ValidationPipe({ transform: true }))
getHello(@Query() query: MyQuery) {
  return query;
}

Pourquoi cela fonctionne-t-il ?

1) Les tuyaux sont appliqués à tous vos décorateurs, par exemple. @Body() , @Param() , @Query() et peut transformer les valeurs (par ex. ParseIntPipe ) ou effectuer des contrôles (par exemple ValidationPipe ).

2) Le ValidationPipe utilise en interne class-validator y class-transformer pour la validation. Pour être en mesure d'effectuer la validation de vos entrées (objets javascript simples), il doit d'abord les transformer en votre classe dto annotée, ce qui signifie qu'il crée une instance de votre classe. Avec le paramètre transform: true il créera automatiquement une instance de votre classe dto.

Exemple (en gros, comment ça marche) :

class Person {
  firstname: string;
  lastname?: string = 'May';

  constructor(person) {
    Object.assign(this, person);
  }
}

// You can use Person as a type for a plain object -> no default value
const personInput: Person = { firstname: 'Yuna' };

// When an actual instance of the class is created, it uses the default value
const personInstance: Person = new Person(personInput);

0voto

hackemate ninja Points 121

Donnez seulement une valeur dans votre Dto comme ceci :

export class MyQuery {
  readonly myQueryItem: string = 'value default';
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X