satisfies مقابل تعليق النوع
حافظوا على استنتاج القيم الحرفية مع التحقق من البنية
satisfies مقابل تعليق النوع درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
نمط التعليق النوعي
يتحقق النمط التقليدي const config: Type = {...} من الكائن، لكن نوع المتغير يصبح Type، مما يوسّع أي قيم حرفية داخله.
type Config = { mode: string; level: number };
const config: Config = { mode: "dark", level: 5 };
// config.mode has type string
console.log(config.mode);كيف يبدو التوسيع
مع استخدام التعليق النوعي، تكون قيمة config.mode من النوع string. ولا يمكنك إسنادها إلى متغير يتوقع القيمة الحرفية "dark".
type Config = { mode: string };
const config: Config = { mode: "dark" };
// const m: "dark" = config.mode; // Error: string not assignable to "dark"
console.log(config.mode);نمط satisfies
مع استخدام const config = {...} satisfies Type، يحتفظ المتغير بنوعه الدقيق المستدل عليه، مع استمرار التحقق منه مقابل Type.
type Config = { mode: string; level: number };
const config = { mode: "dark", level: 5 } satisfies Config;
// config.mode has type "dark"
console.log(config.mode);الحفاظ على الاستدلال الدقيق
الآن تكون قيمة config.mode هي القيمة الحرفية "dark"، ولذلك تعمل في أي موضع يتطلب النوع الضيق.
type Config = { mode: string };
const config = { mode: "dark" } satisfies Config;
const m: "dark" = config.mode; // OK
console.log(m);يستمر التحقق في كلا الأسلوبين
يرفض كلا الأسلوبين الكائنات غير الصالحة. والفرق يكمن فقط في نوع المتغير الناتج، وليس في حدوث التحقق من عدمه.
type Config = { level: number };
// const a: Config = { level: "x" }; // Error
// const b = { level: "x" } satisfies Config; // Error
const ok = { level: 3 } satisfies Config;
console.log(ok.level);اكتشاف الخصائص الإضافية
كما هي الحال مع التعليقات النوعية، يبلّغ satisfies عن الخصائص الزائدة غير الموجودة في النوع المستهدف، مما يساعد على اكتشاف الأخطاء الإملائية في المفاتيح.
type Config = { mode: string };
// const c = { mode: "dark", extar: true } satisfies Config; // Error: extar
const c = { mode: "dark" } satisfies Config;
console.log(c.mode);الحفاظ على طبيعة tuple
يساعد satisfies أيضًا المصفوفات على الاحتفاظ بدقة شبيهة بـ tuple عند دمجه مع as const، مع الاستمرار في التحقق من أنواع العناصر.
type Nums = readonly number[];
const xs = [1, 2, 3] as const satisfies Nums;
// xs is a readonly tuple [1, 2, 3], validated as numbers
console.log(xs.length);التعليق النوعي يوسّع أعضاء الاتحاد
إذا كان الحقل اتحادًا مثل "a" | "b"، فإن التعليق النوعي الذي يستخدم نوع الاتحاد يبقيه اتحادًا، لكن نوع الحقل الأوسع يوسّعه. أما satisfies فيثبّت العضو الدقيق.
type Config = { tier: string };
const withAnn: Config = { tier: "pro" }; // tier: string
const withSat = { tier: "pro" } satisfies Config; // tier: "pro"
console.log(withAnn.tier, withSat.tier);الحفاظ على الإكمال التلقائي عند القراءة
لأن satisfies يحافظ على المفاتيح والقيم الحرفية، يمكن للمحررات اقتراح الإكمال التلقائي استنادًا إلى الكائن الدقيق، لا إلى النوع المعلن الأوسع.
type Theme = Record<string, string>;
const theme = { bg: "black", fg: "white" } satisfies Theme;
// theme.<autocomplete shows bg and fg>
console.log(theme.bg, theme.fg);الاختيار بين الأسلوبين
استخدم تعليقًا نوعيًا عاديًا عندما تريد النوع الأوسع فعلًا. واستخدم satisfies عندما تريد التحقق، وتحتاج أيضًا إلى البنية الدقيقة المستدل عليها لاحقًا.
type Config = { mode: string };
// Want wide type for reassignment flexibility -> annotation
let a: Config = { mode: "dark" };
// Want exact literals for later indexing -> satisfies
const b = { mode: "dark" } satisfies Config;
console.log(a.mode, b.mode);ملخص مقارن
يوسّع التعليق النوعي، بينما يحافظ satisfies على الدقة. وكلاهما يجري التحقق. وبالنسبة إلى إعدادات غير قابلة للتغيير تقرأ منها، يكون satisfies عادةً الخيار الافتراضي الأفضل.
type C = { color: string; size: number };
const widened: C = { color: "red", size: 1 };
const exact = { color: "red", size: 1 } satisfies C;
console.log(widened.color, exact.color);اختبار سريع: satisfies مقابل التعليق النوعي
اختبر فهمك للفرق بينهما.
مراجعة: satisfies مقابل التعليق النوعي
يتحقق التعليق النوعي من القيم الحرفية، لكنه يوسّعها إلى أنواعها الأساسية. أما المعامل satisfies فيتحقق منها ويحافظ على الاستدلال الدقيق، بما في ذلك القيم والمفاتيح الحرفية ودقة tuple.
type C = { mode: string };
const c = { mode: "dark" } satisfies C;
const exact: "dark" = c.mode;
console.log(exact);الأسئلة الشائعة
هل درس «satisfies مقابل تعليق النوع» مجاني؟
نعم — نص درس «satisfies مقابل تعليق النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «satisfies مقابل تعليق النوع»؟
حافظوا على استنتاج القيم الحرفية مع التحقق من البنية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «satisfies مقابل تعليق النوع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- سبب وجود satisfies
- satisfies مقابل تعليق النوع
- satisfies مقابل تأكيد as
- أنماط satisfies العملية