أنشئ واجهة TypeScript من JSON
الصق كائناً نموذجياً لتحصل على واجهة TypeScript جاهزة: في المثال يصبح id من النوع number، ويصبح tags من النوع string[]، ويبقى المفتاح display-name بين علامتي اقتباس، والكل تحت الاسم UserRecord. مجاناً في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
تحلل الأداة العينة، وتتحقق من أن الجذر كائن، ثم تنتج واجهة حتمية للسلاسل والأرقام والقيم المنطقية والقيم الفارغة والمصفوفات والكائنات المتداخلة.
كيف يُستنتج كل نوع
ينظر المولّد إلى كل قيمة في عينتك لا إلى أسماء المفاتيح. يصبح النص string، وأي رقم number، ويأخذ الصواب أو الخطأ نوعه الخاص، وتصبح القيمة الفارغة null. وتتحول الكائنات داخل الكائنات إلى أنواع متداخلة، وتُقيَّم القوائم بكل عناصرها لا بأولها فقط: قائمة النصوص وحدها تعطي string[]، والقائمة المختلطة اتحاداً مثل (string | number | null)[]. أما المفاتيح التي لا تُكتب كما هي، مثل display-name، فتبقى بين علامتي اقتباس، وتحافظ الخصائص على ترتيب العينة الأصلية.
أخطاء شائعة وكيف تتجنبها
لا تستطيع عينة واحدة أن تثبت أن قيمة ما اختيارية، لذلك تُعلَّم كل الخصائص بأنها مطلوبة، فعدّلها يدوياً حيث قد تُغفل بياناتك الحقيقية شيئاً. والقائمة الفارغة لا تقدم دليلاً فتصبح unknown[]، والكائن الفارغ يصبح Record<string, never>، فاختر عينة قوائمها وكائناتها ممتلئة. ويجب أن يكون النص بصيغة بيانات صارمة لا JavaScript: أسماء بين علامات اقتباس مزدوجة، بلا تعليقات ولا فواصل زائدة في النهاية، وكائن في المستوى الأعلى.
ابدأ بعينة تشبه بياناتك الحقيقية
تُمثّل الكائنات المتداخلة بأنواع كائنات داخل واجهة الجذر. تُخرج كل خاصية موجودة في العينة على أنها مطلوبة، لأن مثالاً واحداً لا يثبت أن الحقل اختياري. للحصول على نتيجة مفيدة، اختاروا عينة تتضمن الحقول وتنوعات القيم التي يستقبلها تطبيقكم فعلياً.
يمكنكم أيضاً تقديم اسم للجذر مثل <code>UserResponse</code>، ويجب أن يكون معرّف TypeScript صالحاً وغير محجوز. عند إغفاله يُستخدم <code>RootObject</code>.
افهموا المصفوفات والقيم الفارغة والبنى المتداخلة
يراعي استنتاج المصفوفة جميع العناصر الموجودة في العينة بدلاً من فحص العنصر الأول فقط. تتحول القائمة التي لا تضم إلا سلاسل إلى <code>string[]</code>، بينما تنتج القائمة المختلطة اتحاداً ثابتاً مثل <code>(string | number | null)[]</code>. لا توفر المصفوفة الفارغة دليلاً على نوع عناصرها، ولذلك تصبح <code>unknown[]</code> بدلاً من تخمين نوع قد يكون مضللاً.
تُمثّل الكائنات داخل المصفوفات بأنواع كائنات مضمّنة، وتُعالج المصفوفات المتداخلة تكرارياً. تصبح الكائنات الفارغة <code>Record<string, never></code>، بما يوضح أن العينة لم تعرض حقولاً معروفة. تُخرج المفاتيح التي لا تصلح معرّفات TypeScript عادية، بما فيها المفاتيح ذات المسافات أو علامات الترقيم أو الكلمات المحجوزة، كخصائص نصية بين علامتي اقتباس.
لا يخترع المولّد مؤشرات اختيارية أو تواريخ أو أنواعاً حرفية أو تعدادات أو أسماء فئات خاصة بالمجال.
حالات الاستخدام
تهيئة بيانات الاختبار والتكاملات
ولّدوا أنواعاً متداخلة ثابتة للإعدادات أو السجلات المستوردة أو بيانات الاختبار من دون تتبع كل خاصية يدوياً.
الأسئلة الشائعة
كيف تُحدد أنواع المصفوفات الفارغة؟
تصبح unknown[] لأن العينة الفارغة لا تقدم دليلاً على نوع عناصرها.
هل توسم الخصائص بأنها اختيارية؟
لا. الخصائص الموجودة في العينة مطلوبة. راجعوا عدة حمولات أو مخططاً موثوقاً لتحديد الحقول الاختيارية.
ما نوع النص الذي يمكنني لصقه؟
نص بيانات صارم يكون مستواه الأعلى كائناً. تحتاج الأسماء إلى علامات اقتباس مزدوجة، ولا يُسمح بالتعليقات ولا بالفواصل الزائدة في النهاية. وتُرفض القيمة المفردة أو null أو القائمة في المستوى الأعلى، لأن النتيجة تصف كائناً.
هل يمكنني اختيار اسم الواجهة؟
نعم. أدخل اسماً مثل UserRecord، على أن يكون اسماً صالحاً في TypeScript وليس كلمة محجوزة. وإذا تركته فارغاً سُمّيت الواجهة RootObject، فتعطي كل إعادة النص نفسه.
ما النوع الذي تأخذه قائمة ذات قيم مختلطة؟
تُفحص كل العناصر لا الأول وحده. القائمة المكونة من نصوص فقط تصبح string[]، أما الخليط فينتج اتحاداً ثابتاً مثل (string | number | null)[]، فتعكس النتيجة ما تُظهره العينة بالضبط.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev2/json-to-typescript-interface \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"json":"{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"}'const res = await fetch("https://api.kit.forhosting.com/dev2/json-to-typescript-interface", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/json-to-typescript-interface",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/json-to-typescript-interface", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"json":"{\\"id\\":42,\\"name\\":\\"Ada\\",\\"active\\":true,\\"tags\\":[\\"admin\\",\\"editor\\"],\\"profile\\":{\\"email\\":\\"ada@example.com\\",\\"score\\":9.5}}"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"json":"{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/json-to-typescript-interface", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.json_to_typescript_interface",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_chars | 1000000 |
max_depth | 64 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
حوّل كائن JSON تمثيلياً إلى واجهة TypeScript من دون تثبيت مولّد أو تتبع كل قيمة متداخلة يدوياً. كما تحمي مفاتيح JSON غير المعتادة بعلامات اقتباس، وتتيح لكم اختيار اسم واجهة الجذر. تصبح النتيجة جاهزة للنسخ إلى تطبيق أو SDK أو بيانات اختبار أو تكامل بيانات بوصفها نوعاً أولياً عملياً.
ابدؤوا بكائن JSON تمثيلي
ألصقوا نص JSON صالحاً تكون قيمته الجذرية كائناً، مثل استجابة API أو سجل إعداد أو حمولة webhook أو مستند محفوظ. يفحص المولّد القيم بدلاً من أسماء الحقول؛ فتصبح السلسلة <code>string</code>، ويصبح أي رقم JSON من نوع <code>number</code>، وتصبح القيمة المنطقية <code>boolean</code>، وتصبح القيمة الفارغة <code>null</code>. يجب أن يكون الإدخال نص JSON لا صياغة كائن JavaScript؛ فأسماء الخصائص تحتاج إلى علامتي اقتباس مزدوجتين، والتعليقات غير مسموحة، والفواصل الختامية غير صالحة. تُرفض القيم المفردة وnull والمصفوفات في الجذر لأن الناتج المطلوب واجهة تصف كائن JSON.
افهموا المصفوفات والقيم الفارغة والبنى المتداخلة
وهكذا يعبّر الناتج بأمانة عن الأدلة الموجودة في JSON المقدم. يتبع ترتيب الخصائص كائن JSON الأصلي، في حين تستخدم عناصر الاتحاد ترتيباً حتمياً.
راجعوا الواجهة المولّدة قبل استخدامها في الإنتاج
قارنوه بعدة حمولات أو بوثائق المزود قبل تقرير ما إذا كانت الخصائص اختيارية أو قابلة للقيمة null أو أضيق نطاقاً أو مشتركة عبر واجهات مسماة. إذا احتوت عينة على null وأخرى على سلسلة، فأضيفوا هذه المعرفة إلى النوع الذي تحافظون عليه. يفيد الناتج الحتمي في مراجعة الشيفرة؛ فالمدخل والاسم نفسيهما ينتجان النص نفسه دائماً بلا شبكة أو نموذج أو عشوائية أو تاريخ حالي. تعاملوا مع التعريف المولّد بوصفه وصفاً دقيقاً للعينة المقدمة ومسودة أولى قوية للشيفرة الفعلية، لا دليلاً على عقد API خارجي كامل. يبقى الطابع الزمني سلسلة لأن JSON لا يملك نوع تاريخ، ويبقى العدد الصحيح <code>number</code> لأن TypeScript لا يميز أعداد JSON الصحيحة وقت التشغيل. يعيد JSON غير الصالح، أو غياب النص، أو الاسم غير الصالح، أو التداخل المفرط، أو الجذر غير الكائن خطأ <code>invalid_input</code> بدلاً من شيفرة جزئية. يبدأ تشغيل API من $0.002 لكل طلب، ويمكن للمتصفح تطبيق منطق الاستنتاج النقي نفسه محلياً.
حالات التكامل
تحديد نوع استجابة API غير مألوفة
أنشئوا واجهة أولية عملية من استجابة ملتقطة، ثم حسّنوا الحقول الاختيارية بالرجوع إلى وثائق API.
توثيق حمولات webhook
حوّلوا حدثاً تمثيلياً إلى TypeScript مقروء يمكن لخدمة الاستقبال واختباراتها مشاركته.
أسئلة تقنية
ما المدخلات المقبولة؟
يجب أن يحتوي حقل json على نص JSON صالح تكون قيمته الجذرية كائناً. تُرفض المصفوفات والقيم المفردة وnull في الجذر.
هل تتعرف الأداة على التواريخ أو التعدادات؟
لا. تبقى سلاسل JSON من نوع string، ولا يُستنتج معنى المجال أو قيود enum من عينة واحدة.
كم تبلغ تكلفة طلب API؟
يبدأ طلب API من $0.002. يستخدم مشغّل المتصفح المنطق الحتمي نفسه.