Interopérabilité Kanon ↔ Zod
Données de compatibilité réelles. Pas de suppositions. Analysé contre Zod v4 Classic.
Zod v4 propose deux API :
- Classic : Chaînage de méthodes (
.optional(),.nullable()). Cette page couvre Classic. - Mini : Fonctions pures comme l'API native de Kanon (
optional(schema),nullable(schema))
Si vous utilisez Zod Mini, envisagez d'utiliser les imports directs de Kanon au lieu du shim z : la syntaxe est quasi identique.
TL;DR
API principale compatible. Primitives, composites, unions, wrappers, coercition, refinements et transforms fonctionnent avec le shim z.
| Métrique | Valeur |
|---|---|
| Primitives | 15/15 (100%) |
| Composites | 6/6 (100%) |
| Opérateurs | 3/3 (100%) |
| Modes objet | 3/3 (100%) |
| Effort de migration | Changement d'imports uniquement (pour la plupart des schémas) |
Si vous utilisez des primitives, objets, tableaux, unions et wrappers basiques, vous êtes couvert. Changez vos imports et c'est fait.
À propos de cette page
L'API native de Kanon est conçue pour un tree-shaking optimal : fonctions pures, imports directs, pas de surcharge de classes. Nous recommandons d'utiliser les imports directs pour les applications en production.
Cependant, pour une migration fluide depuis Zod, Kanon fournit un shim z avec une API compatible 1:1 avec Zod :
// Changez juste votre import
import { z } from "pithos/kanon/helpers/as-zod.shim";
// Votre code Zod existant fonctionne tel quel
const schema = z.object({
name: z.string(),
age: z.number().optional(),
});
Cette page se concentre sur le shim z : toutes les tables de compatibilité ci-dessous utilisent la syntaxe z.. Une fois migré, vous pouvez progressivement refactorer vers les imports directs pour une optimisation maximale du bundle.
Ce que Kanon gère de la même façon
Cliquez pour développer chaque catégorie et voir les fonctionnalités supportées :
Primitives (100%)15/15
z.string(), z.number(), z.boolean(), z.bigint(), z.date(), z.symbol(), z.undefined(), z.null(), z.void(), z.any(), z.unknown(), z.never(), z.literal(), z.enum(), z.nativeEnum()
Composites (100%)6/6
z.object(), z.array(), z.tuple(), z.record(), z.map(), z.set()
Opérateurs (100%)3/3
z.union(), z.intersection(), z.discriminatedUnion(), .or(), .and()
Wrappers (100%)7/7
.optional(), .nullable(), .nullish(), .default(), .readonly(), z.lazy(), .catch()
Transformations d'objets (100%)5/5
.partial(), .required(), .pick(), .omit(), .keyof()
Modes objet (100%)3/3
z.object() (strip par défaut), .strict(), .passthrough()
Coercition (100%)5/5
z.coerce.string(), z.coerce.number(), z.coerce.boolean(), z.coerce.bigint(), z.coerce.date()
Refinements (100%)2/2
.refine(), .superRefine()
Transforms (100%)2/2
.transform(), .array()
Contraintes de chaînes (100%)10/10
.min(), .max(), .length(), .email(), .url(), .uuid(), .regex(), .includes(), .startsWith(), .endsWith()
Contraintes numériques (100%)10/10
.min(), .max(), .int(), .positive(), .negative(), .gt(), .gte(), .lt(), .lte(), .multipleOf()
Exemples de code
Avec le shim z, votre code Zod fonctionne tel quel. Changez juste l'import.
Schéma basique
// Zod
import { z } from "zod";
// Kanon (changez juste l'import !)
import { z } from "pithos/kanon/helpers/as-zod.shim";
// Le même code fonctionne dans les deux
const userSchema = z.object({
id: z.number(),
name: z.string(),
active: z.boolean(),
});
Avec contraintes
Kanon supporte les mêmes méthodes de contraintes que Zod, y compris les longueurs min/max, les nombres positifs et la validation d'email :
import { z } from "pithos/kanon/helpers/as-zod.shim";
const productSchema = z.object({
sku: z.string().min(3).max(10),
price: z.number().positive().max(9999),
email: z.string().email(),
});
Avec Optional/Nullable
Les modificateurs optional, nullable et nullish fonctionnent de manière identique à Zod, aucun changement de code nécessaire :
import { z } from "pithos/kanon/helpers/as-zod.shim";
const profileSchema = z.object({
username: z.string(),
bio: z.string().optional(),
avatar: z.string().nullable(),
nickname: z.string().nullish(),
});
Types union
Kanon supporte les types union via z.union() et les valeurs littérales, comme Zod :
import { z } from "pithos/kanon/helpers/as-zod.shim";
const statusSchema = z.union([
z.literal("pending"),
z.literal("approved"),
z.literal("rejected"),
]);
const responseSchema = z.object({
data: z.union([z.string(), z.number()]),
});
Ce que Kanon ne supporte pas
Le shim z se concentre sur la validation principale. Certaines fonctionnalités de Zod ne sont pas disponibles et ne le seront probablement jamais.
Absent du shim z
| Fonctionnalité | Alternative |
|---|---|
.pipe() | Chaînez les schémas manuellement |
.brand() | Utilisez des assertions de types |
z.instanceof() | Utilisez .refine(v => v instanceof Class) |
z.preprocess() | Utilisez .transform() avant la validation |
z.custom() | Utilisez .refine() ou .superRefine() |
Validateurs de format de chaînes (Zod v4)
| Fonctionnalité | Alternative |
|---|---|
z.email(), z.uuid(), z.url() | Utilisez z.string().email(), etc. |
z.jwt(), z.ipv4(), z.base64() | Utilisez z.string().regex() |
Pourquoi Kanon ne couvre pas 100% de Zod
Kanon se concentre délibérément sur les fonctionnalités essentielles : celles que vous utilisez réellement dans 90%+ des projets.
Couvert à 100% :
- Primitives, objets, tableaux, tuples, unions, intersections
- Optional, nullable, default, transforms, refinements
- Contraintes de chaînes (min, max, regex, email, url...)
Non inclus par choix :
- Formats d'identifiants spécialisés (CUID, ULID, KSUID, XID, NanoID...)
- Validateurs réseau (plages CIDR, numéros de téléphone E.164...)
- Validateurs de hash (MD5, SHA256, SHA512 en hex/base64...)
- Parsing de durées ISO 8601, formats datetime étendus...
Ce sont des cas limites. Zod les embarque par défaut, ce qui ajoute du poids même si vous ne les utilisez jamais. Kanon non. Si vous en avez besoin, z.string().regex() fonctionne parfaitement.
Ce que Kanon ajoute
Au-delà de la compatibilité Zod, Kanon apporte des fonctionnalités uniques :
| Fonctionnalité | Description |
|---|---|
Compilation JIT | Compilation automatique en validateurs optimisés (2-10x plus rapide) |
Tree-Shaking parfait | Fonctions pures, pas de surcharge de classes, bundle le plus petit possible |
strictObject() / looseObject() | Modes de validation d'objets explicites |
parseBulk() | Validation par lots optimisée pour les tableaux |
Imports directs | Importez uniquement ce que vous utilisez pour un tree-shaking maximal |
Prêt à migrer ? Le guide de migration complet étape par étape se trouve dans la documentation du module Kanon: installer, changer les imports, gérer les cas limites et optimiser avec les imports directs. Aller au guide de migration →
Pas sûr de quelle bibliothèque correspond à votre cas d'usage ? Voir l'aperçu des comparaisons.
Une fois migré avec le shim z, vous pouvez progressivement refactorer vers les imports directs pour des bundles encore plus petits. Consultez la documentation API pour l'API native de Kanon.
Related
- Kanon vs Zod — Comparaison complète : philosophie, API, migration
- Interopérabilité Zygos ↔ Neverthrow — Une autre histoire de remplacement direct
- Table d'équivalence — Équivalence complète entre bibliothèques
- Guide du module Kanon — Documentation complète du module
Tree-Shaking parfait
Imports directs