Skip to content

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 :

typescript
type UserId = C.GetNewType<typeof UserId>;

Syntaxe

typescript
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()

typescript
function create(
	value: RawType | Primitive<RawType>
): Right<NewType<NewTypeName, RawType, ConstraintName>> | Left<C.NewTypeError<NewTypeName>>

createOrThrow()

typescript
function createOrThrow(
	value: RawType | Primitive<RawType>
): NewType<NewTypeName, RawType, ConstraintName>

Lève C.CreateNewTypeError en cas d'échec de validation.

createWithLarge()

typescript
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()

typescript
function createWithLargeOrThrow(
	value: LargeInput
): NewType<NewTypeName, RawType, ConstraintName>

Lève C.CreateNewTypeError en cas d'échec de validation.

createWithUnknown()

typescript
function createWithUnknown(
	value: unknown
): Right<NewType<NewTypeName, RawType, ConstraintName>> | Left<C.NewTypeError<NewTypeName>>

createWithUnknownOrThrow()

typescript
function createWithUnknownOrThrow(
	value: unknown
): NewType<NewTypeName, RawType, ConstraintName>

Lève C.CreateNewTypeError en cas d'échec de validation.

is()

typescript
function is(
	value: unknown
): value is NewType<NewTypeName, RawType, ConstraintName>

getConstraint()

typescript
function getConstraint(
	name: ConstraintName
): ConstraintHandler<ConstraintName>

Propriétés

name

Le nom unique du NewType (ex: "userId").

Voir aussi

Diffusé sous licence MIT.