Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تأكيدات الأنواع (Type Assertions)

جزء من قسم مقدمة إلى Luau في رحلة Lua على Coddy — الدرس 68 من 73.

في بعض الأحيان تكون لديك معرفة بقيمة ما أكثر مما يعرفه checker الخاص بالأنواع في Luau — مثل قيمة محددة كـ any ولكنك know أنها في الواقع سجل مستخدم (user record)، على سبيل المثال. تتيح لك تأكيدات الأنواع (type assertion) (والتي تسمى أيضًا cast) إخبار checker بـ "ثق بي، تعامل مع هذه القيمة على أنها من هذا النوع". مشغل التنسيق (cast operator) في Luau هو :::

type User = {id: number, username: string}

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- المدقق يعرف الحقول الآن

يغير الـ cast فقط ما يعتقده checker للأنواع — وهو لا يفعل شيئًا في وقت التشغيل (runtime). إنه لا يحول القيمة مطلقًا: "5" :: any تظل هي النص "5"، وليست الرقم 5 (استخدم tonumber للتحويل الفعلي). كما أنه لا يتحقق أبدًا من الصحة: إذا أكدت نوعًا خاطئًا (wrong)، فلن يظهر خطأ في الـ cast نفسه — بل سيتصرف كودك بشكل خاطئ later، عندما يحاول الوصول إلى fields غير موجودة.

متى تستخدمه: عندما تصل قيمة كـ any (أو اتحاد واسع) وتكون really تعرف شكلها (shape). متى لا تستخدمه: لإسكات خطأ في النوع لا تفهمه — فالخطأ يخبرك عادةً بوجود خلل حقيقي، وإخفاؤه بـ cast مجرد إخفاء للمشكلة. يفضل استخدام التحققات الفعلية (مثل حراس typeof في الدرس القادم) عندما يمكنك التحقق في وقت التشغيل.

challenge icon

التحدي

سهل

قم بمحاكاة معالجة السجلات التي تصل من مصدر خارجي دون معلومات نوع البيانات (type information).

  • قم بإنشاء type User = {id: number, username: string, isActive: boolean}.
  • اكتب دالة describeUser(data: any): string تقوم بتحويل نوع data إلى User باستخدام :: وترجع User [id]: [username] (Active: [isActive]) المتمم باستخدام سلسلة الاستيفاء النصية (string interpolation).

يحدد كود البداية بالفعل ثلاثة سجلات خام ذات نوع any. استدعِ describeUser على كل منها واطبع النتائج الثلاثة بالترتيب.

السطر الأول المتوقع: User 42: alice_dev (Active: true)

جرّب بنفسك

-- سجلات خام من مصدر خارجي: من النوع `any`
local rawUser1: any = {id = 42, username = "alice_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}
local rawUser3: any = {id = 99, username = "charlie_user", isActive = true}

-- اكتب الكود هنا
-- 1) أعلن نوع User
-- 2) describeUser(data: any): string — حوّل باستخدام :: وابنِ الرسالة
-- 3) اطبع وصف السجلات الثلاثة كلها
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس مقدمة إلى Luau