0Pricing
TypeScript Academy · درس

الخطافات المخصصة باستخدام الأنواع العامة والاستنتاج

اكتب خطافات مخصصة قابلة لإعادة الاستخدام باستخدام للقيم والنتائج والأخطاء، واستفد من الاستنتاج والقيود لإنشاء واجهات برمجية آمنة.

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

مقدمة

الهدف: بناء خطافات عامة تبدو أصلية: خطاف localStorage ذي نوع محدد، ومحمّل غير متزامن، ومساعد للتحكم وغير التحكم. ستعتمد على الاستنتاج بحيث نادرًا ما يحتاج المستدعون إلى تحديد الأنواع.

  • إرجاع tuples لتوفير تجربة شبيهة بـ React
  • استخدام القيود عند الحاجة
  • عدم استخدام any

useLocalStorage<T>

أرجع tuple من الشكل [value, set] مثل useState. حافظ على اتساق T بين القيمة والمُعيّن.

import { useEffect, useState } from "react"

export function useLocalStorage<T>(key: string, initial: T): [T, (v: T | ((prev: T) => T)) => void] {
  const [value, setValue] = useState<T>(() => {
    try {
      const raw = localStorage.getItem(key)
      return raw ? (JSON.parse(raw) as T) : initial
    } catch {
      return initial
    }
  })

  useEffect(() => {
    try { localStorage.setItem(key, JSON.stringify(value)) } catch {}
  }, [key, value])

  const set = (v: T | ((prev: T) => T)) => {
    setValue(prev => (typeof v === "function" ? (v as (p: T) => T)(prev) : v))
  }

  return [value, set]
}

// Usage
// const [user, setUser] = useLocalStorage("user", { id: 1, name: "Ada" })

useAsync<T>

أرجع كائنًا يحتوي على value وerror وloading. ويُستنتج نوع value من الوعد الذي تُرجعه fn.

import { useEffect, useState } from "react"

export function useAsync<T>(fn: () => Promise<T>, deps: unknown[] = []) {
  const [value, setValue] = useState<T | null>(null)
  const [error, setError] = useState<unknown>(null)
  const [loading, setLoading] = useState<boolean>(false)

  useEffect(() => {
    let cancelled = false
    setLoading(true)
    fn().then(
      (v) => { if (!cancelled) { setValue(v); setError(null) } },
      (e) => { if (!cancelled) { setError(e); setValue(null) } }
    ).finally(() => { if (!cancelled) setLoading(false) })
    return () => { cancelled = true }
  }, deps)

  return { value, error, loading }
}

// Usage
// const { value, error, loading } = useAsync(() => fetch("/api").then(r => r.json()))

useControlled<T>

ادعم نمطي التحكم وعدم التحكم باستخدام مساعد واحد. ويحافظ الـ tuple على اتساق T.

import { useState } from "react"

type ControlledProps<T> = {
  value?: T
  defaultValue: T
  onChange?: (v: T) => void
}

export function useControlled<T>({ value, defaultValue, onChange }: ControlledProps<T>): [T, (v: T) => void] {
  const [inner, setInner] = useState<T>(defaultValue)
  const isControlled = value !== undefined
  const current = isControlled ? (value as T) : inner
  const set = (v: T) => { isControlled ? onChange?.(v) : setInner(v) }
  return [current, set]
}

// Usage
// const [v, setV] = useControlled({ value, defaultValue: "", onChange: setValue })

الاستنتاج والقيود

فضّل الاستنتاج من الوسيطات؛ وأضف قيود extends فقط عندما يحتاج الخطاف إلى حقول محددة.

// Inference works from the initial value
const [settings, setSettings] = useLocalStorage("settings", { theme: "dark", pageSize: 20 })
// T = { theme: string; pageSize: number }

// Constrain T when needed
interface WithId { id: string }
function useById<T extends WithId>(items: T[], id: string) {
  return items.find(x => x.id === id) || null
}

// Usage
const user = useById([{ id: "u1", name: "Ada" }], "u1")

نصائح

نصائح:

  • أرجع tuples لتوفير تجربة شبيهة بـ React وتحديد متسق للأنواع.
  • لا تستخدم any مطلقًا في تواقيع الخطافات العامة.
  • اقبل المحدّثات (prev) => next لتسهيل انتقالات الحالة.

التحقق من أنواع الخطافات

تحقق سريع: أي توقيع يلائم خطاف localStorage العام بأفضل شكل؟

مراجعة

مراجعة: بنيت خطافات عامة تعتمد على الاستنتاج، وتستخدم القيود عند الضرورة فقط، وتعرض نتائج على شكل tuples أو كائنات تشبه واجهات React الأصلية.

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

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

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

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

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

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

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

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

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

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

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

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

  1. الخطافات المخصصة باستخدام الأنواع العامة والاستنتاج
  2. أنواع Suspense وحدود الأخطاء
← العودة إلى TypeScript Academy