أوامر إعادة الهيكلة مع أقفال سلامة الأنواع
قفل Type Safety
أكتر refactor بيغلط هو نقل JavaScript-لـ-TypeScript. الموديل بيضيف types، بس بيضيف أسهل types — any في كل مكان، أو unknown متحوّل لشكل الموديل افترضه. النتيجة بتتجمّع. بس ما بتعملش type-check لأي حاجة فيها معنى.
الحل إنك تقفل الـ type system مباشرة في الـ prompt:
Refactor this JavaScript to TypeScript. Hard constraints:
- No
any. Noas unknown as ...cheats.- Public function signature unchanged.
- Add JSDoc-style
@throwsfor any error path.- Use
readonlyon 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 as | Type 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 في كل مكان — مفيش type-check حقيقي
- قيم default متضافة في الهدوء
- إعادة الترتيب ممكن تفسد الـ state على الفشل
- الـ reviewer مش عارف اتغيّر إيه
Refactor مقفول (lock list كاملة)
- Generic <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 عبر ملفات متعددة. :::
سجّل الدخول للتقييم