NewType
Un NewType est un type conçu pour répondre aux exigences métier, tout en étant basé sur un type primitif (ou une structure de données) existant. Il permet d'ajouter des contraintes et des règles spécifiques, garantissant que les valeurs respectent les conditions définies par le métier.
Exemple
Fonctionnement
Un NewType est un wrapper typé qui :
- valide une entrée via un
DataParser(DP.string(),DP.number(), etc.) - applique éventuellement une ou plusieurs contraintes
- « brand » la valeur avec un nom (ex:
"userId") pour éviter les mélanges accidentels
Vous déclarez un NewType via C.createNewType(...), ce qui retourne un handler. Ce handler sert ensuite à créer des valeurs sûres au runtime, tout en conservant un typage précis côté TypeScript.
Le deuxième argument peut être un DataParser ou un handler de primitive Clean. Passer C.String, C.Number, C.Boolean, C.BigInt, C.Date ou C.Time réutilise le DataParser déjà porté par cette primitive.
Créer un NewType
Créer un NewType, c'est définir :
- un nom (ex:
"userId") - un
DataParser(ex:DP.number()) ou un handler de primitive (ex:C.Number) - des contraintes optionnelles (ex:
C.Positive,C.Email, ...)
Pour récupérer le type du NewType généré, utilisez :
type UserId = C.GetNewType<typeof UserId>;Syntaxe
const UserId = C.createNewType(
"userId",
DP.number(),
C.Positive,
);
const UserName = C.createNewType(
"userName",
C.String,
C.StringMin(2),
);Utilisez la surcharge DataParser lorsque la valeur repose sur une forme de parser ou un schéma personnalisé. Utilisez la surcharge avec handler de primitive lorsque le NewType correspond directement à une primitive Clean et doit réutiliser son parser existant.
Méthodes et Propriétés
Un NewTypeHandler expose les mêmes méthodes de création/validation que les autres handlers Clean, ainsi que quelques propriétés.
Méthodes
create()
function create(
value: RawType | Primitive<RawType>
): Right<NewType<NewTypeName, RawType, ConstraintName>> | Left<C.NewTypeError<NewTypeName>>createOrThrow()
function createOrThrow(
value: RawType | Primitive<RawType>
): NewType<NewTypeName, RawType, ConstraintName>Lève C.CreateNewTypeError en cas d'échec de validation.
createWithLarge()
function createWithLarge(
value: LargeInput
): Right<NewType<NewTypeName, RawType, ConstraintName>> | Left<C.NewTypeError<NewTypeName>>Accepte le type d'entrée large connu par le DataParser, la primitive ou les contraintes du NewType. Cette méthode sert notamment à hydrater une valeur depuis une source moins précise tout en récupérant un NewType affiné après validation.
createWithLargeOrThrow()
function createWithLargeOrThrow(
value: LargeInput
): NewType<NewTypeName, RawType, ConstraintName>Lève C.CreateNewTypeError en cas d'échec de validation.
createWithUnknown()
function createWithUnknown(
value: unknown
): Right<NewType<NewTypeName, RawType, ConstraintName>> | Left<C.NewTypeError<NewTypeName>>createWithUnknownOrThrow()
function createWithUnknownOrThrow(
value: unknown
): NewType<NewTypeName, RawType, ConstraintName>Lève C.CreateNewTypeError en cas d'échec de validation.
is()
function is(
value: unknown
): value is NewType<NewTypeName, RawType, ConstraintName>getConstraint()
function getConstraint(
name: ConstraintName
): ConstraintHandler<ConstraintName>Propriétés
name
Le nom unique du NewType (ex: "userId").
