أوامر إعادة الهيكلة مع أقفال سلامة الأنواع

قفل Type Safety

5 دقيقة للقراءة

أكتر refactor بيغلط هو نقل JavaScript-لـ-TypeScript. الموديل بيضيف types، بس بيضيف أسهل types — any في كل مكان، أو unknown متحوّل لشكل الموديل افترضه. النتيجة بتتجمّع. بس ما بتعملش type-check لأي حاجة فيها معنى.

الحل إنك تقفل الـ type system مباشرة في الـ prompt:

Refactor this JavaScript to TypeScript. Hard constraints:

  • No any. No as unknown as ... cheats.
  • Public function signature unchanged.
  • Add JSDoc-style @throws for any error path.
  • Use readonly on inputs that are not mutated.
function chunk(arr, size) {
  if (size <= 0) throw new Error("size must be > 0");
  const out = [];
  for (let i = 0; i < arr.length; i += size) {
    out.push(arr.slice(i, i + size));
  }
  return out;
}

Output ONLY the TypeScript code block.

Claude Sonnet 4.5 رجّع:

/**
 * Splits an array into chunks of the specified size.
 * @throws {Error} If size is less than or equal to 0
 */
function chunk<T>(arr: readonly T[], size: number): T[][] {
  if (size <= 0) throw new Error("size must be > 0");
  const out: T[][] = [];
  for (let i = 0; i < arr.length; i += size) {
    out.push(arr.slice(i, i + size));
  }
  return out;
}

Captured from Claude Sonnet 4.5 (claude-sonnet-4-5) on 2026-04-27. Re-runs may differ slightly.

اتفرّج في اللي حقّقته الأقفال:

القفلالموديل عمل إيهكان هيحصل إيه من غيره
No anyاستخدم generic <T>كان هيحط arr: any[]
No as unknown asType flow نضيفممكن كان يـcast out لـ T[][] من any[][]
Signature ما تغيّرتشنفس الاسم، نفس الترتيب، نفس الأنواع دلالياًممكن كان يقلب arr و size، أو يعيد التسمية
@throws JSDocضاف الـ doc comment بشرط الـ errorكان هيسيبه ضمني
readonly على الـ inputsضاف readonly T[] لـ arrكان هيسيب arr: T[]، ويسمح بالتغيير

لاحظ اللي ما تغيّرش. body الـ function — المنطق الفعلي — byte-identical لنسخة JavaScript. الـ exception بيرمى بنفس الرسالة في نفس الشرط. مفيش validation جديد، مفيش defaults جديدة، مفيش imports جديدة. الـ lock list منع كل الـ silent regressions دي.

فايدة خفية: الـ <T> generic ما كانش في الـ lock list، بس الموديل ضافه كالطريقة الوحيدة يلبّي "no any" مع الحفاظ على فايدة الـ function. الأقفال بتدفع الموديل ناحية القرارات الصح حتى لما الشكل المحدد ما يتقالّش.

جنب-لجنب: نفس الـ JS-to-TS port بـ lock list ومن غيرها:

Refactor مفتوح مقابل Refactor مقفول

خطر

Refactor مفتوح ("نضّف ده")

any cheatsarr: any[]
Signature محفوظأحياناً
Error semanticsممكن تتقلب
أمان الـ mutationمفيش readonly
العيوب
  • any في كل مكان — مفيش type-check حقيقي
  • قيم default متضافة في الهدوء
  • إعادة الترتيب ممكن تفسد الـ state على الفشل
  • الـ reviewer مش عارف اتغيّر إيه
آمن

Refactor مقفول (lock list كاملة)

any cheats0
Signature محفوظByte-identical
Error semanticsنفس الـ throw، نفس الشرط
أمان الـ mutationreadonly T[] على الـ inputs
المزايا
  • Generic &#x3C;T> بيطلع طبيعي — الأقفال بتجبر الشكل الصح
  • مسار الـ error في مكانه الأصلي
  • JSDoc @throws متضاف
  • الـ diff فيه بس إضافات الـ types

Template قفل type-safety قابل لإعادة الاستخدام، لأي TS refactor:

- No `any`. No `as unknown as ...` cheats.
- Public function signature unchanged.
- Add JSDoc-style `@throws` for any error path.
- Use `readonly` on inputs that are not mutated.
- No new runtime validation; preserve original error semantics.
- No new imports.

احفظه. أول 3 سطور لوحدهم بيمسكوا 80% من refactor regressions. الـ list كلها بتمسك قريب من 100%.

التالي: تكبير الانضباط ده لـ migrations عبر ملفات متعددة. :::

اختبار

الوحدة 3: Prompts الـ Refactoring

خذ الاختبار
هل كان هذا الدرس مفيدًا؟

سجّل الدخول للتقييم

نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.