-
المساهمات
19762 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
472
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
يوجد منصة خمسات للخدمات المُصغرة، وبها تنصيفات عديدة للخدمات التي بإمكانك تقديمها في حال إمتلكت المهارات اللازمة: بعد تحديد التنصيف المناسب، قم بوضع خدماتك به مع صور ووصف لما تقدمه ولكن بشكل إحترافي، وستجد هنا تفصيل لكيفية تنفيذ ذلك: البدء لبائعي الخدمات وبالنسبة لسحب الأرباح، فالوسائل المتاحة هي باي بال أو تحويل بنكي.
-
لا تشغل بالك بما سيتم استبداله، الأمر ليس بتلك البساطة في مجال البرمجة، فمنذّ زمن يُشاع عن لغة PHP أنها أصبحت قديمة وستختفي وسيتم استبدالها ولم يحدث ذلك حتى الآن، فالواقع العملي هو ما يفرض كلمته. ووجود مشاريع ضخمة عمرها أكثر من 10 سنوات تعتمد على Node.js يضع حاجز قوي أما إنتقال تك المشاريع إلى تقنية جديدة، ربما المشاريع الجديدة في حال أثبتت المكتبة أو الإطار كفائتها، لكن ذلك بحاجة إلى وقت فهي ما زالت تقنية حديثة وغير مستقرة مقارنًة بـ Node.js وفي مجتمع جافاسكريبت بالأخص كل أسبوع تقريبًا هناك مكتبة أو إطار جديد، لذا الأمر مُشتت ومُجهد، الصحيح هو الإنتظار لحين أن تنضج تلك التقنيات وستفرض نفسها على الواقع العملي، وحينها تستطيع تعلمها واستخدامها. حاليًا ما يجب التركيز عليه هو المهارات المطلوبة في سوق العمل بالنسبة للتخصص الذي اخترته والذي غالبًا هو Full-Stack، لذا أنت تستهدف MERN Stack وهو ما يجب التركيز عليه وليس التقنيات الجديدة. وبعد اكتساب خبرة في التخصص الذي اخترته وتنفيذ مشاريع قوية، تستطيع تعلم تقنيات جديدة وإختبارها في مشاريع جانبية لا مشكلة، فذلك مطلوب بالفعل لتطوير مهاراتك ولكي تبقى مُطلع على الجديد في مجال البرمجة والذي يتغير بسرعة كبيرة كل فترة. أي هناك أولويات يجب الإلتزام بها في بداية السنة الأولى من رحلة تعلم البرمجة، ولا تحيد عنها لكي تصل لما تريده.
-
منهج الدورة مُتدرج يبدأ من شرح أساسيات بايثون وحتى أساسيات تعلم الآلة، وللتفصيل: الأسس البرمجية السليمة عبر لغة Python التعامل مع مختلف صيغ الملفات مثل إكسل Excel وورد Word وخدمات المستندات السحابية استخراج البيانات من صفحات الويب Web Scraping وتحليلها أساسيات التعامل مع قواعد البيانات عبر بايثون، والتعامل مع البريد الإلكتروني لإرسال الرسائل أساسيات إطار العمل جانغو Django بناء تطبيق إدارة المهام باستخدام إطار العمل جانغو Django تطوير متجر إلكتروني متكامل باستخدام إطار العمل جانغو Django وربطه مع وسائل الدفع باي بال PayPal وسترايب Stripe أساسيات إطار العمل فلاسك Flask، وبناء مدونة بسيطة تطوير تطبيقات أودو Odoo تطوير واجهة برمجية API اعتمادًا على نمط RESTful لمعالجة الصور وبالتالي تستطيعين العمل بالمجالات التالية: مطور Full-stack لبناء مواقع الويب والمتاجر الإلكترونية أي قادر على تطوير الواجهة الأمامية والخلفية أيضًا من خلال Django و Flask. مطور واجهة خلفية Back-End فقط. مطور odoo ويتم بها أيضًا شرح أساسيات تحليل البيانات وتعلم الآلة أيضًا، لكن الأساسيات فقط وليس شرح بشكل مُتعمق فهو خارج نطاق الدورة وخاص بدورة الذكاء الاصطناعي بالأكاديمية. وكمثال لوصف وظيفة خاصة بمطور بايثون حيث ستجدي وصف مشابه له على مواقع التوظيف مثل LinkedIn: معرفة عميقة بلغة بايثون وقدرة على استخدامها لبناء تطبيقات ويب. خبرة في استخدام إطار عمل مثل Django أو Flask لبناء واجهات المستخدم الخلفية. معرفة باستخدام مكتبات ORM للتعامل مع قواعد البيانات (مثل PostgreSQL أو MySQL) وقدرة على دمج مصادر بيانات متعددة. فهم جيد للمتعددات المتزامنة وكيفية التعامل معها بكفاءة في بايثون، أي كتابة أكواد بايثون تعمل على معالجة عدة مهام في نفس الوقت. خبرة في استخدام محركات قوالب مثل Jinja2 لإنشاء صفحات ديناميكية. فهم أساسي لـ HTML, CSS, و JavaScript لبناء واجهات مستخدم جذابة. معرفة بمبادئ الأمان، المصادقة، والتفويض. فهم المبادئ التصميمية الجيدة لبناء تطبيقات قابلة للتطوير والصيانة. خبرة في استخدام مكتبات لمعالجة الأحداث التي تسمح بتنفيذ أكواد معينة عند حدوث أحداث محددة. قدرة على بناء تطبيقات تعمل بكفاءة على منصات متعددة (جوال، سطح مكتب). القدرة على تصميم قواعد بيانات فعالة تلبي احتياجات العمل. مهارات قوية في اختبار الوحدات وتصحيح الأخطاء. خبرة في استخدام أدوات مثل Git لإدارة إصدارات الكود وبالتالي الدورة تغطي جزء كبير من المهارات المطلوبة بالوظيفة، وتحتاجين فقط إلى تعلم أساسيات تقنيات الواجهة الأمامية، مثل JavaScript و HTML5 و CSS3 وذلك متاح بشكل مجاني من خلال المسار الأول من دورة تطوير واجهات المستخدم. وبالطبع أي دورة مهما كانت يجب الدراسة بجانبها للتعمق أكثر والاستزادة، فلا توجد تلك الدورة التي توفر كل شيء.
-
numpy مكتبة أساسية وبُنيت عليها أهم مكتبات في مجال تحليل البيانات وتعلم الآلة، منها pandas وScikit-learn ووMatplotlib. فهياكل البيانات في Pandas مثل Series و DataFrame مبنية على مصفوفات numpy وبإجراء عمليات حسابية في Pandas، ففي الخلفية يتم الإعتماد على numpy. وما أنت بحاجة إلى تعلمه في البداية هو التالي: تفهم هكيل البيانات ndarray فكل شيء في المكتبة يدور حول ذلك الكائن، وباستيعابه ستتمكن من فهم المكتبة بأكملها. قبل أن تتمكن من تحليل أي شيء، تحتاج إلى إنشاء مصفوفة، فتعلم طريق إنشائها بالمكتبة. ثم تعلم الخصائص الخاصة بالمصفوفة Array Attributes في المكتبة مثل shape وndim وغيرهم. ثم الفهرسة والتقسيم العمليات الحسابية الموجهة Vectorized Operations دوال التجميع الأساسية الفهرسة المنطقية Boolean Indexing ابحث على اليوتيوب عن "أساسيات مكتبة numpy" وستجد مصادر مختلفة اختر ما تريد.
-
لا مشكلة، آلية الإختبار هي كالتالي: بعد إنهاء 4 مسارات من الدورة على الأقل، أو الدورة بالكامل عليك رفع المشاريع التي قمت بها بالدورة على حسابك في github، ثم التحدث لمركز المساعدة وإخبارهم أنك تريد التقدم للإختبار وتوفير روابط المشاريع على github. ثم الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.
- 2 اجابة
-
- 1
-
-
يجب وجود خادم لكي يتم من خلاله اكتشاف التحديثات الجديدة ويتم تحديث الصفحة بشكل تلقائي لعرضها، لذا ستحتاج إلى تثبيت إضافة Live server بالضغط على أيقونة الإضافات في المحرر ثم البحث عن live server أو تستطيع الضغط على الرابط التالي مباشرًة للتوجه لصفحة الإضافة ثم اضغط على install وسيتم فتحها مباشرًة في محرر vscode فاضغط على install للتثبيت: Live Server الآن قم بفتح مجلد المشروع في vscode بالضغط على file ثم open folder واختر مجلد المشروع. ثم افتح ملف index.html وهو الملف الرئيسي للمشروع، ثم ستجد بالأسفل زر باسم go live اضغط عليه وسيتم تشغيل الخادم في المتصفح وأي تغييرات تجريها ثم تحفظها بالضغط على CTRL + S ستظهر في المتصفح مباشرًة:
-
لو أردت تمارين بسيطة ابحث عن Python Quizzes وستجد النتائج التي تبحث عنها لكن بالإنجليزية، أما إذا أردت اختبارات باللغة العربية فستجد ذلك هنا: كذلك تستطيع حل المساءل البرمجية لتحسين مهارة التفكير المنطقي لديك ومهارتك في لغة بايثون بشكل عام، من خلال منصات HackerRank أو Edabit أو Codewars للمبتدئين، حيث تبدأ بالتدرج من خلال منصة سهلة نسبيًا مثل Codewars وحل الأسئلة السهلة ثم المتوسطة ثم الصعبة، ثم الإنتقال لمنصة leetcode وحل المسائل التي بها بدءًا من مستوى متوسط فما فوق. ثم ابحث على اليوتيوب عن "مشاريع بايثون للمبتدئين" وذلك من أجل أن تحاول تطبيق فكرة المشروع وأيضًا تجد مرجع للعودة إليه يشرح لك كيفية تنفيذ الأمر في حال واجهتك صعوبة وأيضًا لمقارنة الكود الخاص بك بالكود الخاص بالشرح. ففي البداية أنت بحاجة إلى من يرشدك، ولكن حاول التفكير وتقسيم المشروع إلى أجزاء والعمل عليها، وليس الإسراع لمشاهدة الشرح في الفيديو، ولا مشكلة في ذلك لكن بعد المحاولة فأنت ما زلت تتعلم. وإليك بعض الأفكار: بناء حاسبة تقوم بأربع عمليات رياضية أساسية (+، -، *، /). يمكنك تحسينها لدعم عمليات أكثر تعقيدًا. أنشئ تطبيق يسمح للمستخدم بإضافة وحذف وعرض مهام يريد القيام بها. بناء محول يتيح للمستخدم تحويل بين وحدات مختلفة، مثل تحويل الوحدات الزمنية أو الوحدات العملات. كتابة لعبة تسمح للاعب بتخمين الرقم الذي يفكر فيه البرنامج، مع تقديم تلميحات إذا كان الجواب غير صحيح. أنشئ برنامجًا يقوم بإنشاء كلمات سر عشوائية وقوية للمستخدمين. بناء تطبيق يسمح للمستخدم بإضافة وعرض جهات الاتصال، مثل أسماء وأرقام الهواتف وعناوين البريد الإلكتروني. ابنِ لعبة تقوم فيها بمحاكاة رمي النرد وحساب مجموع النقاط على النرد. ابنِ برنامجًا يتيح للمستخدم إدخال نص وتحويله إلى لغة مستهدفة باستخدام مكتبة مثل Google Translate API. اكتب برنامجًا يقوم بعد الكلمات والجمل في نص معين، مفيد للمدوّنين أو الكتّاب. قم ببناء برنامج يعرض التوقيت في عدة مناطق زمنية حول العالم.
-
loc للاختيار بناءًا على الـ Labels أي أسماء الصفوف وأسماء الأعمدة للوصول إلى البيانات، وتتعامل مع أسماء الفهرس وأسماء الأعمدة، وعند استخدام التقطيع مثلاً df.loc[['A', 'B']] تكون النتيجة شاملة لنقطة النهاية. بينما iloc للاختيار بناءًا على الموقع الرقمي أو الفهرس، أي لمواقع الصفوف والأعمدة بغض النظر عن أسمائها وتبدأ من 0، تمامًا مثل التعامل مع القوائم في بايثون. وعند استخدام التقطيع تكون النتيجة غير شاملة لنقطة النهاية، كما في بايثون. بالتالي استخدم loc في حال لديك فهرس ذو معنى كتواريخ، أو أسماء، أو رموز تعريفية، وذلك سيجنبك الخطأ لو تغير ترتيب البيانات. واستخدم iloc للوصول إلى البيانات بناءًا على موقعها الرقمي بغض النظر عن أسماء الفهرس، أو عندما يكون الفهرس هو الفهرس الرقمي الافتراضي 0, 1, 2, وهكذا، وبالطبع الأمر مفيد جدً في الـ loops أو عند إجراء عمليات حسابية على مواقع محددة.
-
هنا: for (int i = 0; i < 6; i++) { printf("%d ", numbers[i]); } الحلقة تبدأ من i = 0 والشرط هو i < 6، بالتالي ستستمر طالما أن i تساوي 0, 1, 2, 3, 4, 5 وعندما تصل قيمة i إلى 6، يصبح الشرط 6 < 6 غير صحيح false، فتتوقف الحلقة. لذا الكود يطبع فقط العناصر من numbers[0] إلى numbers[5]، ويتجاهل تماماً العنصر الأخير numbers[6] الذي يحتوي على الرقم 7. الصحيح هو: for (int i = 0; i < 7; i++) { printf("%d ", numbers[i]); }
-
المتوفر في موسوعة حسوب هو التالي: HTML CSS Sass Bootstrap Python PHP Laravel Twig Ruby Rails JavaScript TypeScript Node.js React Next.js React Native jQuery Bash Cordova Kotlin Arduino Algorithms Design Patterns SQL Refactoring Liquid وذلك ما ستجده في الصفحة الرئيسية للموسوعة. لذا ستحتاج إلى الإعتماد على التوثيق الرسمي بالإنجليزية: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.astype.html https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc أو البحث على اليوتيوب.
- 2 اجابة
-
- 1
-
-
تحتاج إلى تثبيت الحزم من خلال الأمر: npm i ثم سيظهر لك أخطاء بالنسبة للصور، وذلك لأنّ TypeScript لا تتعرف بشكل افتراضي على أنواع الملفات غير البرمجية مثل ملفات CSS والصور jpg, png, webp، لذا في مجلد src قم بإنشاء ملف باسم custom.d.ts وضع به التالي لتعريفها: declare module '*.css'; declare module '*.jpg'; declare module '*.jpeg'; declare module '*.png'; declare module '*.webp'; declare module '*.svg'; declare module 'swiper/css' {} declare module 'swiper/css/pagination' {} declare module 'swiper/css/autoplay' {} declare module 'swiper/css/effect-fade' {} declare module 'swiper/css/navigation' {}
-
السؤال غير واضح، في حال السؤال خاص بأحد الدروس، أرجو وضع استفسارك في التعليقات أسفل الدرس وليس في قسم أسئلة البرمجة العام. عامًة الأمر يتعلق بكيفية عمل المصفوفات في البرمجة، وليس بالعملية الحسابية، بل بعملية استدعاء أو جلب. في معظم لغات البرمجة، يبدأ ترقيم عناصر المصفوفة (قائمة في بايثون) من الرقم 0 وليس من 1، لذلك: العنصر الأول هو points[0] العنصر الثاني هو points[1] العنصر الثالث هو points[2] بالتالي points[1] يعني الحصول على العنصر الثاني بدون أي تغيير أو حساب، والعنصر الثاني المخزن بالفعل هو [1, 4, 0] وهو مصفوفة.
- 3 اجابة
-
- 1
-
-
البداية تبدأ بتحسين الأساسيات للملف الشخصي، بمعنى يجب تعديل الصورة الشخصية بصورة إحترافية أكثر وليس صورة شخصية خاصة بوسائل التواصل الإجتماعي. ثم تعديل معرض الأعمال ووضع صور توضح المشروع وليس صورة واحدة فقط، بمعنى قم بإلتقاط صور للمشروع وضعها في وصف المشروع. ثم تحسين الوصف الخاص بحسابك "نبذة عنك" فهي عامة جدًا أي الجميع يكتب ذلك الوصف وخالي من أي إضافة شخصية. ثم عليك تعلم كيفية كتابة عرض إحترافي، وستجد تفصيل هنا: وأثناء تقديم عروض على المشاريع تفقد نوعية المشاريع الأكثر طلبًا والمهارات المطلوبة، وقم بتحسين مستواك في تلك المهارات أو تعلمها، وكذلك المشاريع اعمل على تطوير مشاريع مشابهة لما هو مطلوب بالتالي يصبح لديك مثال وإثبات على أنك تستطيع القيام بالمطلوب، وذلك يحُسن من قبول عرضك بشكل كبير.
-
ما هي المشكلة التي تواجهها؟ بدون برمجة ستحتاج إلى استخدم أداة BotFather التي توفرها تيليجرام لإنشاء بوت جديد وتلك الخطوة أساسية، بجانب منصة Manybot أو Chatfuel أو ManyChat لإدارة الردود الآلية. أو برمجيًا فستحتاج إلى الإعتماد على مكتبة مثل python-telegram-bot، وكمثال بسيط: from telegram.ext import Updater, MessageHandler, Filters def reply(update, context): if "سعر" in update.message.text: update.message.reply_text("الأسعار: الباقة الأساسية 50 ريال، الباقة المميزة 100 ريال.") elif "تواصل" in update.message.text: update.message.reply_text("للتواصل: @support أو رقم الواتساب 050xxxxxxx") updater = Updater("ضع التوكن هنا") updater.dispatcher.add_handler(MessageHandler(Filters.text, reply)) updater.start_polling()
-
لا يتم في الشهادة كتابة مسارات معينة، بل يتم بها كتابة أنك اجتزت الدورة كالتالي: والشهادة لا معنى لها بدون تحقيق استفادة من الدورة، هي إثبات على أنك درست محتوى معين ويتم الحصول عليها بعد إختبارات نظرية وعملية وليس لمجرد الحضور لذا هي شهادة لها وزنها، لكن الأهم في مجال البرمجة هو مهاراتك أنت. آلية الإختبار هي كالتالي: بعد إنهاء 4 مسارات من الدورة على الأقل، أو الدورة بالكامل عليك رفع المشاريع التي قمت بها بالدورة على حسابك في github، ثم التحدث لمركز المساعدة وإخبارهم أنك تريد التقدم للإختبار وتوفير روابط المشاريع على github. ثم الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.
-
ما قمت به حتى الآن عمل رائع جدًا والقليل من يقوم بالتطبيق بشكل عملي بجانب الدورة أي عدم الإكتفاء بما يتم شرحه والتطبيقات العملية المتاحة. وبخصوص المشاريع فلا أنصحك بوضع المشاريع التي تقوم بها في البداية، فالتصميم لن يكون جيد بطبيعة الحال، لذا انتظر لبعض الوقت لحين العمل على تحسين مهارة التصميم والتي هي بحاجة إلى وقت، وبالطبع ليس عليك أن تكون مُصمم فأنت مطور، أقصد تحسين تلك المهارة من خلال الاستلهام وتعلم أساسيات التصميم الجيد، ولا مشكلة في نقل التصميم كما هو لكن يجب توضيح ذلك عند نشره أي أنك قمت بالجزء البرمجي فقط. المشاريع الأولية هي بمثابة تدريب لك، وكذلك المشاريع التي تتم بالدورة الجميع قام بها، لذا حاول التعديل في التصميم ووضع لمسة خاصة بك وإضافة مزايا أخرى أيضًا، وهي مشاريع مناسبة للنشر لكن مع التعديل. الحالة الوحيدة التي يمكنك بها نشر المشاريع الأولية التي تقوم بها بجانب الدورة، هي بنشر ما تعلمته أيضًا، بمعنى كتابة شرح مفيد به معلومات تختصر ما تعلمته أثناء تنفيذك للمشروع والتحديات التي واجهتها، أي تستطيع نشر المشروعين في منشور واحد، مع وضع صور للتوضيح وليس الروابط فقط. ومع مرور الوقت اختر 3 مشاريع ناضجة وبمستوى جيد وقم بنشرهم على فترات وكتابة ما تعلمته في كل مشروع ونتيجة تراكم الخبرات التي أوصلتك لتنفيذه، وتعيينهم لقسم Featured في حسابك. وبالنسبة للصور اعتمد على التالي: Unsplash https://www.pexels.com/ https://www.freepik.com/ https://www.humaaans.com/ https://www.drawkit.io/ https://blush.design/
-
ستحتاج إلى مجموعة من المكتبات لتنفيذ ما تريد، وهم: pyautogui لمحاكاة حركة الماوس والكيبورد. subprocess و os لتشغيل أوامر النظام. psutil لمراقبة موارد النظام CPU، RAM، وخلافه. pywin32 (Windows) للتحكم في نوافذ Windows وتطبيقاتها. أما بالنسبة لأندرويد فستعتمد على ADB للتحكم في الهاتف من الكمبيوتر باستخدام مكتبة بايثون adb-shell وبالطبع يجب ربط الهاتف بالحاسوب عن طريق الـ USB. ثم ستحتاج إلى أتمتة واجهة المستخدم من خلال أحد المكتبات التالية uiautomator, Appium, أو scrcpy مع بايثون. ومثلاً لإرسال رسالة SMS من أندرويد عبر ADB: from adb_shell.adb_device import AdbDeviceTcp device = AdbDeviceTcp("192.168.1.100", 5555) device.connect() device.shell("am start -a android.intent.action.SENDTO -d sms:123456789 --es sms_body 'مرحباً من بايثون' --ez exit_on_sent true") وبالطبع استبدل الرقم 123456789 بالرقم الذي تريد الإرسال إليه، واستبدل 192.168.1.100 بعنوان هاتفك ولمعرفته، افتح الإعدادات ثم خيارات المطور ثم فعل ADB over network، وسيظهر لك عنوان IP مثل 192.168.x.x واستخدمه بدل 192.168.1.100 في الكود. أما بالنسبة لـ IOS فالأمر صعب ومعقد.
- 5 اجابة
-
- 1
-
-
أحسنت في ذلك، فيما يخص TypeScript، فالأفضل تعريف الـ Interfaces في ملف منفصل وليكن types.ts أو interfaces.ts في حال إذا ستُستخدم في أكثر من مكان، أو على الأقل خارج الدالة المكونة. أيضاً، النوع id: number | null غير ضروري بما أنك تستخدم Date.now()، فالملاحظة ستحصل دائمًا على id عند إنشائها، وتستطيع تبسيطه إلى id: number. الحالة الوحيدة التي تكون فيها القيمة null هي للمتغير selectedNote، وهو ما قمت به بشكل صحيح useState<number| null>(null)، لكن id داخل كائن الملاحظة نفسه لن يكون null أبدًا. وبالنسبة لتحديد أنواع الدوال، فمعظم الدوال سواء addToNoteHandler و updateNoteHandler لا تحتوي على أنواع محددة للـ parameters الخاصة بها أو القيمة العائدة منها ، وTypeScript تستنتجها بناءًا على الكود الخاص بالدالة، لكن تحديدها صراحةً يجعل الكود أوضح. وللعلم بإمكانك إنشاء Hook مخصص وقابل لإعادة الاستخدام لإدارة أي حالة في localStorage كالتالي: import { useState, useEffect } from 'react'; function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T) => void] { const [storedValue, setStoredValue] = useState<T>(() => { try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { console.error(error); return initialValue; } }); const setValue = (value: T) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value; setStoredValue(valueToStore); window.localStorage.setItem(key, JSON.stringify(valueToStore)); } catch (error) { console.error(error); } }; return [storedValue, setValue]; } export default useLocalStorage; واستخدامه في App.tsx كالتالي: import useLocalStorage from './hooks/useLocalStorage'; const [notes, setNotes] = useLocalStorage<Note[]>('notes', []);
