برنامه نویسی

فرا گرفتن "زود" در 5 دقیقه

فهرست مطالب

  • اهداف زود
  • برپایی
  • استفاده پایه
  • انواع پایه
  • اعتبارسنجی ها
  • مقادیر پیش فرض
  • تحت اللفظی
  • Enums

    • زود اینومس
    • TS Enums: (اگر ممکن است از Zod enums استفاده کنید)
  • آرایه ها
  • انواع پیشرفته

    • چندتایی
    • اتحادیه های تبعیض آمیز
  • سوابق
  • نقشه ها
  • مجموعه ها
  • وعده ها
  • اعتبار سنجی پیشرفته

    • رسیدگی به خطاها
  • نتیجه

اهداف زود

  1. کتابخانه اعتبارسنجی (ابتدا طرحواره)
  2. اولین کلاس تایپی پشتیبانی (بدون نیاز به دوبار نوشتن انواع)
  3. تغییرناپذیر (تغذیه‌سازی کاربردی)
  4. کتابخانه بسیار کوچک (8 کیلوبایت)

برپایی

قابل استفاده با Node/Deno/Bun/Any Browser و غیره

npm i zod
import { z } from "zod";

باید داشته باشد strict: true در فایل tsconfig

استفاده پایه

// creating a schema
const User = z.object({
  username: z.string(),
});

// extract the inferred type
type User = z.infer<typeof User>;
// { username: string }

const user: User = {username: "Arafat"}

// parsing
mySchema.parse(user); // => "tuna"
mySchema.parse(12); // => throws ZodError

// "safe" parsing (doesn't throw error if validation fails)
mySchema.safeParse(user); // => { success: true; data: "tuna" }
mySchema.safeParse(12); // => { success: false; error: ZodError }

انواع پایه

import { z } from "zod";

// primitive values
z.string();
z.number();
z.bigint();
z.boolean();
z.date();
z.symbol();

// empty types
z.undefined();
z.null();
z.void(); // accepts undefined

// catch-all types
// allows any value
z.any();
z.unknown();

// never type
// allows no values
z.never();

اعتبارسنجی ها

همه انواع در زود اختیاری داشته باشد گزینه ها پارامتری که می توانید به عنوان آخرین پارامتری که مواردی مانند پیام های خطا را تعریف می کند، ارسال کنید.

همچنین بسیاری از انواع دارای اعتبار سنجی هستند که می توانید مانند اختیاری به انتهای نوع زنجیره بزنید

z.string().optional()
z.number().lt(5)
optional() – فیلد را اختیاری می کند
nullable – زمینه را نیز قادر می سازد null
nullish – زمینه را قادر می سازد null یا undefined

برخی از تعداد انگشت شماری از اعتبارسنجی های خاص رشته

z.string().max(5);
z.string().min(5);
z.string().length(5);
z.string().email();
z.string().url();
z.string().uuid();
z.string().cuid();
z.string().regex(regex);
z.string().startsWith(string);
z.string().endsWith(string);
z.string().trim(); // trim whitespace
z.string().datetime(); // defaults to UTC, see below for options

برخی از تعداد انگشت شماری از اعتبارسنجی های خاص

z.number().gt(5);
z.number().gte(5); // alias .min(5)
z.number().lt(5);
z.number().lte(5); // alias .max(5)

z.number().int(); // value must be an integer

z.number().positive(); //     > 0
z.number().nonnegative(); //  >= 0
z.number().negative(); //     < 0
z.number().nonpositive(); //  <= 0

z.number().multipleOf(5); // Evenly divisible by 5. Alias .step(5)

z.number().finite(); // value must be finite, not Infinity or -Infinity

مقادیر پیش فرض

می تواند یک مقدار یا تابع بگیرد.
فقط a را برمی گرداند پیش فرض زمانی که ورودی است تعریف نشده.

z.string().default("Arafat")
z.string().default(Math.random)

تحت اللفظی

const one = z.literal("one");

// retrieve literal value
one.value; // "one"

// Currently there is no support for Date literals in Zod.

Enums

زود اینومس

const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);

type FishEnum = z.infer<typeof FishEnum>;
// 'Salmon' | 'Tuna' | 'Trout'

// Doesn't work without `as const` since it has to be read only
const VALUES = ["Salmon", "Tuna", "Trout"] as const;
const fishEnum = z.enum(VALUES);

fishEnum.enum.Salmon; // => autocompletes

TS Enums: (اگر ممکن است از Zod enums استفاده کنید)

enum Fruits {
  Apple,
  Banana,
}
const FruitEnum = z.nativeEnum(Fruits);

اشیاء

z.object({})

// all properties are required by default
const Dog = z.object({
  name: z.string(),
  age: z.number(),
});

// extract the inferred type like this
type Dog = z.infer<typeof Dog>;

// equivalent to:
type Dog = {
  name: string;
  age: number;
};

.shape.key – طرح واره آن کلید را دریافت می کند

Dog.shape.name; // => string schema
Dog.shape.age; // => number schema

.extend – فیلدهای جدید را به طرح اضافه کنید

const DogWithBreed = Dog.extend({
  breed: z.string(),
});

.merge – دو طرحواره شی را با هم ترکیب کنید

const BaseTeacher = z.object({ students: z.array(z.string()) });
const HasID = z.object({ id: z.string() });

const Teacher = BaseTeacher.merge(HasID);
type Teacher = z.infer<typeof Teacher>; // => { students: string[], id: string }

.pick/.omit/.partial – همان تی اس

const Recipe = z.object({
  id: z.string(),
  name: z.string(),
  ingredients: z.array(z.string()),
});


// To only keep certain keys, use .pick
const JustTheName = Recipe.pick({ name: true });
type JustTheName = z.infer<typeof JustTheName>;
// => { name: string }


// To remove certain keys, use .omit
const NoIDRecipe = Recipe.omit({ id: true });
type NoIDRecipe = z.infer<typeof NoIDRecipe>;
// => { name: string, ingredients: string[] }


// To make every key optional, use .partial
type partialRecipe = Recipe.partial();
// { id?: string | undefined; name?: string | undefined; ingredients?: string[] | undefined }

.deepPartial – مانند جزئی اما برای اشیاء تو در تو

const user = z.object({
  username: z.string(),
  location: z.object({
    latitude: z.number(),
    longitude: z.number(),
  }),
  strings: z.array(z.object({ value: z.string() })),
});

const deepPartialUser = user.deepPartial();

/*
{
  username?: string | undefined,
  location?: {
    latitude?: number | undefined;
    longitude?: number | undefined;
  } | undefined,
  strings?: { value?: string}[]
}
*/

passThrough – اجازه عبور از فیلدهای تعریف نشده

const person = z.object({
  name: z.string(),
});

person.parse({
  name: "bob dylan",
  extraKey: 61,
});
// => { name: "bob dylan" }
// extraKey has been stripped


// Instead, if you want to pass through unknown keys, use .passthrough()
person.passthrough().parse({
  name: "bob dylan",
  extraKey: 61,
});
// => { name: "bob dylan", extraKey: 61 }

.strict – شکست برای فیلدهای تعریف نشده

const person = z
  .object({
    name: z.string(),
  })
  .strict();

person.parse({
  name: "bob dylan",
  extraKey: 61,
});
// => throws ZodError

آرایه ها

const stringArray = z.array(z.string()); – آرایه رشته ها

.element – دریافت طرح واره عنصر آرایه

stringArray.element; // => string schema

.nonempty – مطمئن شوید که آرایه دارای یک مقدار است

const nonEmptyStrings = z.string().array().nonempty();
// the inferred type is now
// [string, ...string[]]

nonEmptyStrings.parse([]); // throws: "Array cannot be empty"
nonEmptyStrings.parse(["Ariana Grande"]); // passes

.min/.max/.length – تضمین اندازه certail

z.string().array().min(5); // must contain 5 or more items
z.string().array().max(5); // must contain 5 or fewer items
z.string().array().length(5); // must contain 5 items exactly

انواع پیشرفته

چندتایی

آرایه با طول ثابت با مقادیر مشخص برای هر شاخص در آرایه

به عنوان مثال آرایه ای از مختصات را در نظر بگیرید.

z.tuple([z.number(), z.number(), z.number().optional()])

.rest – اجازه تعداد نامتناهی از عناصر اضافی از نوع خاص

const variadicTuple = z.tuple([z.string()]).rest(z.number());
const result = variadicTuple.parse(["hello", 1, 2, 3]);
// => [string, ...number[]];

اتحاد. اتصال

می توان آن را با چیزهایی مانند آرایه ها ترکیب کرد تا نوع بسیار قدرتمندی را بررسی کند.

let stringOrNumber = z.union([z.string(), z.number()]);
// same as
let stringOrNumber = z.string().or(z.number());

stringOrNumber.parse("foo"); // passes
stringOrNumber.parse(14); // passes

اتحادیه های تبعیض آمیز

زمانی استفاده می شود که یک کلید بین انواع مختلفی به اشتراک گذاشته شود.

برای مواردی مانند وضعیت ها مفید است.

به Zod کمک می کند تا در بررسی های خود عملکرد بیشتری داشته باشد و پیام های خطای بهتری ارائه می دهد

const myUnion = z.discriminatedUnion("status", [
  z.object({ status: z.literal("success"), data: z.string() }),
  z.object({ status: z.literal("failed"), error: z.instanceof(Error) }),
]);

myUnion.parse({ status: "success", data: "yippie ki yay" });

سوابق

زمانی مفید است که کلیدهای دقیق را نمی دانید و فقط به مقادیر اهمیت می دهید

z.record(z.number()) – تضمین می کند که همه مقادیر اعداد هستند

z.record(z.string(), z.object({ name: z.string() })) – اعتبار کلیدها با الگو و مقادیر مطابق با الگو را تأیید می کند. برای چیزهایی مانند فروشگاه ها، نقشه ها و کش ها خوب است.

نقشه ها

معمولاً می خواهید از این به جای نسخه کلیدی رکورد استفاده کنید

const stringNumberMap = z.map(z.string(), z.number());

type StringNumberMap = z.infer<typeof stringNumberMap>;
// type StringNumberMap = Map<string, number>

مجموعه ها

درست مانند آرایه ها کار می کند (فقط مقادیر منحصر به فرد در یک مجموعه پذیرفته می شود)

const numberSet = z.set(z.number());
type NumberSet = z.infer<typeof numberSet>;
// type NumberSet = Set<number>

وعده ها

اعتبار سنجی را در دو مرحله انجام می دهد:

  1. اطمینان حاصل می کند که شیء وعده است
  2. قلاب می کند .then شنونده وعده اعتبارسنجی نوع بازگشت.
const numberPromise = z.promise(z.number());

numberPromise.parse("tuna");
// ZodError: Non-Promise type: string

numberPromise.parse(Promise.resolve("tuna"));
// => Promise<number>

const test = async () => {
  await numberPromise.parse(Promise.resolve("tuna"));
  // ZodError: Non-number type: string

  await numberPromise.parse(Promise.resolve(3.14));
  // => 3.14
};

اعتبار سنجی پیشرفته

.refine

const email = z.string().refine((val) => val.endsWith("@gmail.com"),
{message: "Email must end with @gmail.com"}
)

همچنین می توانید از superRefine روشی برای رسیدن به سطح پایین در اعتبارسنجی سفارشی، اما به احتمال زیاد به آن نیاز نخواهد داشت.

رسیدگی به خطاها

خطاها در Zod بسیار دقیق هستند و واقعاً توسط انسان خارج از جعبه قابل خواندن نیستند. برای دور زدن این موضوع، می‌توانید پیام‌های خطای سفارشی برای تمام اعتبارسنجی‌های خود داشته باشید، یا می‌توانید از کتابخانه‌ای مانند zod-validation-error که یک ساده اضافه می کند fromZodError روشی برای خوانایی خطا توسط انسان

import { fromZodError } from "zod-validation-error"

console.log(fromZodError(results.error))

نتیجه

مفاهیم بسیار بیشتری از Zod وجود دارد، و من نمی توانم همه این موارد را در اینجا توضیح دهم. با این حال، اگر می خواهید آنها را کشف کنید، به اسناد رسمی Zod بروید. آنها همه چیز را کاملاً در آنجا توضیح داده اند.

خب بچه ها این بود امیدوارم شما بچه ها این دوره تصادف را دوست داشته باشید. من تمام تلاشم را کرده‌ام که همه مفاهیم اساسی زود را انتخاب کنم و توضیح دهم. اگر ابهام یا سوالی دارید، در قسمت نظرات بپرسید. به محض دیدن جواب میدم. همه شما را در مقاله بعدی من می بینم😊.

بازدید کنید:
👨‍💻کارنامه من
🏞️Fiverr من
🌉گیتهاب من

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا