0Pricing
TypeScript Academy · درس

استنتاج الأنواع من المخططات

اشتقوا الأنواع الثابتة مباشرةً من مخططات Zod

استنتاج الأنواع من المخططات درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

تحمل المخططات معلومات النوع

يعرف مخطط Zod نوع TypeScript الذي يتحقق منه. وتستخرج z.infer ذلك النوع، لذا تكتبون البنية مرة واحدة.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User is { name: string; age: number }

الأداة z.infer

ينتج z.infer<typeof schema> النوع الثابت الذي يتحقق منه المخطط. لاحظوا استخدام typeof، إذ تمررون قيمة المخطط.

import { z } from "zod";
const tagSchema = z.array(z.string());
type Tags = z.infer<typeof tagSchema>; // string[]

مصدر واحد للحقيقة

من دون الاستنتاج، ستضطرون إلى صيانة نوع ومخطط كلٌّ على حدة، وقد يختلف أحدهما عن الآخر. يحافظ z.infer على تزامنهما التام.

import { z } from "zod";
const schema = z.object({ id: z.number(), email: z.string() });
type Account = z.infer<typeof schema>;
// Change the schema, the type updates automatically.

استنتاج الأنواع المتداخلة

يتعامل الاستنتاج مع الكائنات والمصفوفات المتداخلة، وينتج نوع TypeScript المتداخل الكامل من مخطط واحد.

import { z } from "zod";
const postSchema = z.object({
  title: z.string(),
  author: z.object({ name: z.string() }),
  tags: z.array(z.string())
});
type Post = z.infer<typeof postSchema>;
// Post.author.name is string

استخدام النوع المستنتَج

استخدموا النوع المستنتَج في أي موضع تستخدمون فيه نوعًا مكتوبًا يدويًا: كوسائط للدوال، أو للمتغيرات، أو لأنواع القيم المُرجعة.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
function greet(u: User): string {
  return "Hi " + u.name;
}

تُرجع Parse النوع المستنتَج

تُرجع schema.parse قيمة محددة النوع مسبقًا بالنوع المستنتَج، ولذلك تكون الشفرة اللاحقة محددة النوع بالكامل.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
const raw: unknown = { name: "Ada", age: 36 };
const user: User = userSchema.parse(raw); // typed and validated

الاختيارية والقابلية للقيمة الفارغة في النوع

تنتقل معدِّلات المخطط إلى النوع المستنتَج. فالحقل الذي يستخدم .optional() يصبح اختياريًا في TypeScript.

import { z } from "zod";
const schema = z.object({
  name: z.string(),
  nickname: z.string().optional()
});
type P = z.infer<typeof schema>;
// P is { name: string; nickname?: string }

الاستنتاج من مصفوفات الكائنات

عند الجمع بين z.array وz.object، يكون النوع المستنتَج مصفوفة من نوع الكائن.

import { z } from "zod";
const usersSchema = z.array(z.object({ id: z.number() }));
type Users = z.infer<typeof usersSchema>;
// Users is { id: number }[]

لماذا نحتاج إلى typeof

المخطط قيمة، لذا تشيرون إلى نوعه باستخدام typeof schema قبل تمريره إلى z.infer.

import { z } from "zod";
const s = z.string();
type S = z.infer<typeof s>; // string
// z.infer<s> would be wrong: s is a value, not a type.

الاستنتاج عبر حدود الوحدات

صدّروا المخطط ونوعه المستنتَج معًا، حتى تتمكن الوحدات الأخرى من التحقق من البنية نفسها واستخدامها باتساق.

import { z } from "zod";
export const userSchema = z.object({ name: z.string() });
export type User = z.infer<typeof userSchema>;
// Consumers import both the runtime schema and the type.

تعريف واحد، وعالمان

يخدم المخطط التحقق أثناء التشغيل، بينما يخدم z.infer تحديد الأنواع أثناء الترجمة. ويشغّل تصريح واحد كليهما، مما يلغي التكرار.

import { z } from "zod";
const configSchema = z.object({ port: z.number(), host: z.string() });
type Config = z.infer<typeof configSchema>;
// Validate at runtime, type at compile time, no drift.

اختبار سريع: استنتاج الأنواع

اختبروا مدى فهمكم لاستنتاج الأنواع من المخططات.

مراجعة: استنتاج الأنواع من المخططات

تعلّمتم أن z.infer<typeof schema> يشتق نوع TypeScript من مخطط Zod، مما يوفر مصدرًا واحدًا للحقيقة للتحقق والأنواع، بما في ذلك البنى المتداخلة والاختيارية وبنى المصفوفات.

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User stays in sync with the schema automatically.

الأسئلة الشائعة

هل درس «استنتاج الأنواع من المخططات» مجاني؟

نعم — نص درس «استنتاج الأنواع من المخططات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «استنتاج الأنواع من المخططات»؟

اشتقوا الأنواع الثابتة مباشرةً من مخططات Zod تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «استنتاج الأنواع من المخططات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات مخططات Zod
  2. استنتاج الأنواع من المخططات
  3. parse مقابل safeParse
  4. تركيب المخططات وتنقيحها
← العودة إلى TypeScript Academy