75 votes

Types conditionnels dans TypeScript

Je me demandais si je pouvais avoir des types conditionnels dans TypeScript ?

Actuellement j'ai l'interface suivante :

 interface ValidationResult {
  isValid: boolean;
  errorText?: string;
}

Mais je veux supprimer errorText , et ne l'avoir que lorsque isValid est false comme propriété requise.

J'aurais aimé pouvoir l'écrire sous l'interface suivante :

 interface ValidationResult {
  isValid: true;
}

interface ValidationResult {
  isValid: false;
  errorText: string;
}

Mais comme vous le savez, ce n'est pas possible. Alors, quelle est votre idée de cette situation?

97voto

bugs Points 7616

Une façon de modéliser ce type de logique est d'utiliser un type d'union, quelque chose comme ceci

 interface Valid {
  isValid: true
}

interface Invalid {
  isValid: false
  errorText: string
}

type ValidationResult = Valid | Invalid

const validate = (n: number): ValidationResult => {
  return n === 4 ? { isValid: true } : { isValid: false, errorText: "num is not 4" }
}

Le compilateur est alors capable de réduire le type en fonction du drapeau booléen

 const getErrorTextIfPresent = (r: ValidationResult): string | null => {
  return r.isValid ? null : r.errorText
}

44voto

CertainPerformance Points 110949

Pour éviter de créer plusieurs interfaces qui ne servent qu'à en créer une troisième, vous pouvez aussi alterner directement, avec un type place :

 type ValidationResult = {
    isValid: false;
    errorText: string;
} | {
    isValid: true;
};

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