JSON থেকে TypeScript ইন্টারফেস জেনারেটর
যেকোনো JSON অবজেক্ট পেস্ট করুন এবং আপনার ব্রাউজারেই সঙ্গে সঙ্গে একটি সম্পূর্ণ টাইপড
TypeScript ইন্টারফেস — বা নেস্টেড ইন্টারফেসের সেট — জেনারেট করুন। নেস্টেড
অবজেক্ট, অ্যারে, ঐচ্ছিক প্রপার্টি, ইউনিয়ন টাইপ ও null সামলায়। কিছুই
আপলোড হয় না।
সর্বশেষ পর্যালোচনা 2026-06-19।
এটি কীভাবে কাজ করে
- পার্স — আপনার JSON ব্রাউজারের নিজস্ব নেটিভ
JSON.parseদিয়ে পার্স হয়। যদি এটি বৈধ JSON না হয়, তাহলে ত্রুটি বার্তা সঙ্গে সঙ্গে দেখা যায়। - অনুমান — ভ্যালু-ট্রি পুনরাবৃত্তভাবে ঘোরা হয়। প্রতিটি অবজেক্ট একটি নামযুক্ত
ইন্টারফেস হয়। অ্যারের জন্য, টাইপ সব এলিমেন্ট থেকে অনুমান করা হয় যাতে ফলাফল
টাইপ প্রতিটি আইটেম কভার করে। যেসব কি-এর ভ্যালু
null, অথবা যা কিছু অ্যারে-এলিমেন্ট থেকে অনুপস্থিত, তাদের?দিয়ে ঐচ্ছিক চিহ্নিত করা হয়। - নির্গমন — ইন্টারফেসগুলো সবচেয়ে-গভীর-আগে (চাইল্ড, তারপর প্যারেন্ট) নির্গত হয়
যাতে ফাইলটি উপর-থেকে-নিচে কোনো ফরওয়ার্ড রেফারেন্স ছাড়াই কম্পাইল হয়। প্রতিটি ইন্টারফেস
exportকরা হয়, যেকোনো.tsবা.d.tsফাইলে পেস্ট করার জন্য প্রস্তুত।
প্রপার্টি কখন ঐচ্ছিক হয়
দুটি অবস্থা কোনো প্রপার্টিকে ঐচ্ছিক চিহ্ন (?) দেয়:
-
নমুনা JSON-এ ভ্যালুটি
null— জেনারেটর?যোগ করে এবং টাইপের শেষে| nullলাগায়, কারণ আসল API হয় ভ্যালু ফেরত দিতে পারে অথবা কিছুই না। -
JSON-এ অবজেক্টের একটি অ্যারে আছে এবং কোনো কি কিছু এলিমেন্টে দেখা যায় কিন্তু সবগুলোতে
নয় — কি-টি মার্জ করা ইন্টারফেসে যোগ হয় কিন্তু
?চিহ্নিত হয়, কারণ প্রতিটি রেকর্ডে তা থাকবে না।
যদি আপনি জানেন কোনো ফিল্ড সর্বদা উপস্থিত থাকে এবং কখনো null হয় না, তাহলে জেনারেট করা
আউটপুট থেকে শুধু ? সরিয়ে দিন।
JSON → TypeScript টাইপ ম্যাপিং
| JSON ভ্যালু | TypeScript টাইপ | উদাহরণ JSON |
|---|---|---|
string | string | "Alice" |
number | number | 42 or 3.14 |
boolean | boolean | true or false |
null | T | null (+ optional ?) | null |
array of T | T[] | ["a","b"] |
array of mixed primitives | (string | number | boolean)[] | [1,"x",true] |
object | interface Name { … } | { "city": "NYC" } |
unknown / empty array | unknown[] | [] |
ইন্টারফেস নামকরণ
ইন্টারফেসের নাম JSON কি-নাম থেকে নেওয়া হয় এবং PascalCase-এ রূপান্তরিত হয় — উদাহরণস্বরূপ,
কি user_profile থেকে UserProfile নামের একটি ইন্টারফেস তৈরি হয়, এবং
lineItems থেকে LineItems। রুট অবজেক্ট সর্বদা উপরের
রুট ইন্টারফেসের নাম ফিল্ডের নাম ব্যবহার করে (ডিফল্ট Root)।
আপনার ডোমেন মডেলের সাথে মেলাতে এটি বদলান — যেমন User, ApiResponse
বা Product।
গোপনীয়তা ও নিরাপত্তা
সমস্ত প্রক্রিয়াকরণ পুরোপুরি আপনার ব্রাউজারের ভেতরে ঘটে — কোনো ডেটা কোনো সার্ভারে পাঠানো হয় না, কোনো কুকি সেট হয় না, এবং কিছুই লগ হয় না। আসল API রেসপন্স, এমনকি তাতে ব্যক্তিগত ডেটা থাকলেও, পেস্ট করা নিরাপদ, কারণ বিষয়বস্তু কখনো আপনার ডিভাইস থেকে বাইরে যায় না। পৃষ্ঠা লোড হওয়ার পরে এই টুলটি অফলাইনেও কাজ করে।
TypeScript কী, এবং টাইপ কেন সাহায্য করে
TypeScript হলো JavaScript-এর একটি টাইপড সুপারসেট, যা Microsoft-এ Anders
Hejlsberg (C# ও Turbo Pascal-এর ডিজাইনার) তৈরি করেন এবং প্রথম প্রকাশিত হয় 2012 সালে। প্রতিটি বৈধ
JavaScript প্রোগ্রাম ইতিমধ্যেই বৈধ TypeScript; TypeScript যা যোগ করে তা হলো একটি
স্ট্যাটিক টাইপ-লেয়ার (static type layer), যা কম্পাইলার আপনার কোড চলার
আগে যাচাই করে এবং তারপর পুরোপুরি মুছে দেয় — ব্রাউজার তখনও সাধারণ JavaScript-ই পায়।
সুবিধা হলো বাগের একটি পুরো শ্রেণি লেখার সময়েই ধরা পড়ে: একটি ভুল বানানের
প্রপার্টি, একটি নম্বর যেখানে স্ট্রিং প্রত্যাশিত ছিল, একটি ফিল্ড যা undefined হতে পারে।
এডিটরগুলো এই টাইপ-তথ্য ব্যবহার করে অটোকমপ্লিট, ইনলাইন ডকুমেন্টেশন ও নিরাপদ স্বয়ংক্রিয়
রিফ্যাক্টরিংয়ের জন্য।
TypeScript স্ট্রাকচারাল টাইপিং (structural typing / "duck typing") ব্যবহার করে: দুটি টাইপ সামঞ্জস্যপূর্ণ যদি তাদের আকৃতি মেলে, তাদের নাম যাই হোক না কেন। কোনো অবজেক্ট সেখানে গ্রহণযোগ্য যেখানে একটি ইন্টারফেস প্রত্যাশিত, যতক্ষণ তাতে অন্তত সঠিক টাইপের আবশ্যক প্রপার্টিগুলো থাকে। এ কারণেই কোনো আসল API রেসপন্স থেকে জেনারেট করা একটিমাত্র সঠিক ইন্টারফেস এত মূল্যবান — এটি সেই ঠিক আকৃতির বর্ণনা দেয় যার ওপর আপনার কোড নির্ভর করতে পারে।
JSON থেকে টাইপ কেন জেনারেট করবেন?
যখন আপনি কোনো JSON API ব্যবহার করেন, তখন রেসপন্সটি কেবল টাইপ-বিহীন ডেটা — আপনার
এডিটর এ সম্পর্কে কিছুই জানে না, তাই প্রতিটি response.user.name একটি অনুমান যা
কেবল রানটাইমে ব্যর্থ হয়। একটি ইন্টারফেস জেনারেট করা সেই রেসপন্সকে একটি
চুক্তিতে (contract) রূপান্তরিত করে: কম্পাইলার এখন জানে কোন ফিল্ড
উপস্থিত এবং প্রতিটি কোন টাইপের, লেখার সময়েই সেগুলো অটোকমপ্লিট করে, এবং
response.user.naem-কে সঙ্গে সঙ্গে ত্রুটি হিসেবে চিহ্নিত করে। কোনো গভীরভাবে নেস্টেড
পেলোডের জন্য এটি হাতে করা ক্লান্তিকর এবং ভুলের সম্ভাবনাময়, যা ঠিক সেই কাজ যা এই টুলটি
স্বয়ংক্রিয় করে — এটি JSON একবার ঘোরে এবং সঠিক, নেস্টেড, export করা ইন্টারফেস নির্গত
করে যা আপনি সরাসরি আপনার প্রজেক্টে পেস্ট করতে পারেন।
interface বনাম type অ্যালিয়াস
TypeScript কোনো অবজেক্ট-আকৃতির নাম দেওয়ার দুটি উপায় দেয়: একটি interface এবং
একটি type অ্যালিয়াস। সাধারণ অবজেক্ট-আকৃতির জন্য এগুলো অনেকটাই পরস্পর
বিনিময়যোগ্য, এবং এই জেনারেটর interface ঘোষণা নির্গত করে কারণ সেগুলো পরিষ্কার
পড়া যায় এবং extend ও মার্জ করা যায়। যখন আপনার এমন কিছু দরকার যা ইন্টারফেস
সরাসরি প্রকাশ করতে পারে না, তখন type অ্যালিয়াস ব্যবহার করুন: ইউনিয়ন
(type Status = "active" | "archived"), টাপল, ম্যাপড টাইপ, বা কোনো প্রিমিটিভের
অ্যালিয়াস। একটি সাধারণ প্রথা হলো "অবজেক্টের সর্বজনীন আকৃতির জন্য ইন্টারফেস, ইউনিয়ন ও
ইউটিলিটি টাইপের জন্য type অ্যালিয়াস" — তবে কোনো কোডবেসের মধ্যে সামঞ্জস্য সঠিক পছন্দের চেয়ে বেশি গুরুত্বপূর্ণ।
একটিমাত্র নমুনা থেকে টাইপ অনুমানের সীমাবদ্ধতা
যেকোনো JSON-থেকে-টাইপ টুল সম্পর্কে — এই টুল সহ — এটাই সবচেয়ে গুরুত্বপূর্ণ বিষয় বোঝা: ইন্টারফেসটি
আপনি যে একটিমাত্র উদাহরণ পেস্ট করেন তা থেকে অনুমান করা হয়, এবং একটি উদাহরণ
কোনো API সম্পর্কে সবকিছু বলতে পারে না। যদি কোনো ফিল্ড কখনো উপস্থিত ও কখনো অনুপস্থিত হয়
কিন্তু আপনার নমুনায় ঘটনাক্রমে অন্তর্ভুক্ত থাকে, তাহলে জেনারেটর তাকে আবশ্যক চিহ্নিত করবে। যদি কোনো ফিল্ড
সাধারণত নম্বর হয় কিন্তু মাঝে মাঝে null, তাহলে কেবল সেই নমুনা যাতে null
আছে একটি ঐচ্ছিক, nullable টাইপ নির্গত করবে। একটি খালি অ্যারে কোনো এলিমেন্ট-টাইপ দেয় না, তাই
তাকে কেবল unknown[]-ই টাইপ করা যায়। এবং একটি স্ট্রিং যা আসলে কোনো ISO
তারিখ, ইমেল বা তালিকাভুক্ত মান (enumerated value), তা কেবল string টাইপ করা হয়,
কারণ JSON স্তরে এটাই সব। জেনারেট করা টাইপকে API-এর আসল ডকুমেন্টেশনের বিপরীতে পরিশীলিত করার
জন্য একটি চমৎকার প্রথম খসড়া হিসেবে ভাবুন, কোনো নিশ্চিত সম্পূর্ণ চুক্তি হিসেবে নয়।
null, undefined ও ঐচ্ছিক ? চিহ্ন
TypeScript একটি সূক্ষ্ম পার্থক্য করে যা JavaScript ঝাপসা করে দেয়। null একটি
স্পষ্ট "কোনো মান নেই"; undefined হলো "এটি কখনো সেট-ই হয়নি"; এবং ঐচ্ছিক
চিহ্ন ?-এর অর্থ প্রপার্টিটি অবজেক্ট থেকে পুরোপুরি অনুপস্থিত থাকতে পারে।
এগুলো এক নয়। যখন আপনি প্রস্তাবিত strictNullChecks কম্পাইলার বিকল্প সক্ষম
করেন, তখন টাইপ-সিস্টেম আপনাকে প্রতিটি ক্ষেত্র সামলাতে বাধ্য করে, যা ক্লাসিক "cannot read
property of undefined" ক্র্যাশ প্রতিরোধ করে। এই জেনারেটর ? (এবং | null)
তখন যোগ করে যখন কোনো নমুনা-মান null হয়, এবং একা ? তখন যখন কোনো কি
অবজেক্ট-অ্যারের কিছু এলিমেন্ট থেকে অনুপস্থিত — নমুনা যা দেখিয়েছে তার একটি সৎ প্রতিফলন। যদি
আপনার ডোমেন-জ্ঞান বলে কোনো ফিল্ড সর্বদা উপস্থিত থাকে, তাহলে আউটপুট থেকে শুধু ?
মুছে দিন।
any বনাম unknown
যখন কোনো টাইপ সত্যিই নির্ধারণ করা যায় না, তখন আপনার কাছে দুটি নির্গমন-পথ আছে। any
সেই মানের জন্য টাইপ-যাচাই বন্ধ করে দেয় — যেকোনো কিছু অনুমোদিত হয়, যা নীরবে ঠিক সেই
বাগগুলোর দরজা আবার খুলে দেয় যা ধরতে TypeScript বিদ্যমান।
unknown নিরাপদ বিকল্প: এটি যেকোনো মান গ্রহণ করে কিন্তু ব্যবহারের আগে
আপনাকে একটি যাচাই দিয়ে তাকে সংকীর্ণ (narrow) করতে বাধ্য করে। আধুনিক শৈলী any-এর ওপর
unknown-কে জোরালোভাবে অগ্রাধিকার দেয়, এবং এ কারণেই এই টুলটি কোনো খালি অ্যারের
জন্য any[]-এর বদলে unknown[] নির্গত করে — এটি আপনার কোডকে ততক্ষণ
সৎ রাখে যতক্ষণ না আপনি আসল এলিমেন্ট-টাইপ দেন।
টাইপ রানটাইমে মুছে যায় — অবিশ্বস্ত ডেটা ভ্যালিডেট করুন
যেহেতু TypeScript টাইপ কম্পাইলেশনের সময় মুছে ফেলা হয়, সেগুলো রানটাইমে কোনো সুরক্ষা দেয় না। যদি কোনো সার্ভার এমন ডেটা ফেরত দেয় যা আপনার ইন্টারফেসের সাথে মেলে না — কোনো অনুপস্থিত ফিল্ড, কোনো স্ট্রিং যেখানে আপনি নম্বর প্রত্যাশা করেছিলেন — তাহলে TypeScript এটি থামাতে পারে না, কারণ ততক্ষণে টাইপগুলো আর থাকে না। কোনো বিশ্বাস-সীমা (trust boundary) পার করা ডেটার (বাহ্যিক API, ব্যবহারকারীর ইনপুট, ওয়েবহুক) জন্য আপনার একটি রানটাইম ভ্যালিডেটর দরকার। Zod, io-ts ও Valibot-এর মতো লাইব্রেরি আপনাকে একবার স্কিমা ঘোষণা করতে দেয় এবং আসা ডেটা ভ্যালিডেট-ও করে এবং তার সাথে মেলা TypeScript টাইপও অনুমান করে, যাতে স্ট্যাটিক টাইপ ও রানটাইম যাচাই কখনো আলাদা না হয়। JSON Schema Ajv-এর মতো ভ্যালিডেটরের সাথে একই কাজ ভাষা-নিরপেক্ষ উপায়ে করে। এই টুল যে ইন্টারফেসগুলো তৈরি করে তা happy-path আকৃতির বর্ণনা দেয়; একটি রানটাইম ভ্যালিডেটর নিশ্চিত করে ডেটা সত্যিই সেই আকৃতিতেই এসেছে।
নমুনা-ভিত্তিক বনাম স্কিমা-ভিত্তিক জেনারেশন
কোনো নমুনা থেকে টাইপ জেনারেট করা, যেমন এখানে, সবচেয়ে দ্রুত পথ যখন আপনার কাছে কেবল একটি উদাহরণ রেসপন্স থাকে — কোনো সেটআপ নেই, কোনো বিল্ড-স্টেপ নেই, পেস্ট করো আর চলো। যখন কোনো API আনুষ্ঠানিক বর্ণনা প্রকাশ করে তখন আপনি আরও ভালো করতে পারেন: একটি OpenAPI (Swagger) ডকুমেন্ট বা একটি GraphQL স্কিমা কোনো কোড-জেনারেটরকে দেওয়া যায় যা প্রতিটি এন্ডপয়েন্ট এবং API দ্বারা নথিভুক্ত প্রতিটি প্রকার কভার করা টাইপ তৈরি করে, এবং যা API বদলালে আবার চালানো যায় যাতে টাইপ কখনো পুরনো না হয়। নমুনা-ভিত্তিক জেনারেশনকে দ্রুত, তাৎক্ষণিক টুল হিসেবে ভাবুন এবং স্কিমা-ভিত্তিক জেনারেশনকে রক্ষণাবেক্ষিত, সম্পূর্ণ-API-এর সমাধান হিসেবে — এগুলো প্রতিযোগিতা নয়, বরং একে অপরের পরিপূরক।
জেনারেট করা খসড়া থেকে প্রোডাকশন টাইপ পর্যন্ত
কয়েকটি দ্রুত সম্পাদনা একটি জেনারেট করা ইন্টারফেসকে একটি পরিশীলিত ডোমেন-টাইপে পরিণত করে। রুট
ইন্টারফেসের নাম Root থেকে অর্থপূর্ণ কিছুতে বদলান (User,
ApiResponse, Invoice)। শিথিল string ফিল্ডকে লিটারাল
ইউনিয়নে সংকীর্ণ করুন যেখানে মান-সেট জানা ("draft" | "published")।
unknown[]-কে আসল এলিমেন্ট-টাইপ দিয়ে বদলান যখন আপনি তা জানেন। আইডেন্টিফায়ারকে
"ব্র্যান্ড" করার কথা ভাবুন যাতে একটি UserId ও একটি OrderId পরস্পর
মিশে না যায়, যদিও দুটোই স্ট্রিং। এবং যদি আপনি কোনো লাইব্রেরি শিপ করেন, তাহলে ইন্টারফেসকে
একটি .d.ts ঘোষণা ফাইলে সরান — একটি কেবল-টাইপ ফাইল যা কোনো
JavaScript নির্গত না করেই আকৃতির বর্ণনা দেয় — যাতে ভোক্তারা শূন্য রানটাইম খরচে সম্পূর্ণ টাইপ-তথ্য পায়।
অবজেক্টের অ্যারে কীভাবে একটিমাত্র ইন্টারফেসে পরিণত হয়
যখন কোনো JSON অ্যারেতে অবজেক্ট থাকে, তখন এই টুলটি প্রতিটি এলিমেন্টের জন্য আলাদা টাইপ তৈরি করে না — এটি
তাদের একটিমাত্র ইন্টারফেসে মার্জ করে যা পুরো সংগ্রহের বর্ণনা দেয়। এটি
সব অবজেক্টে দেখা প্রতিটি কি সংগ্রহ করে, প্রতিটি প্রপার্টির টাইপ তার দেখা মান থেকে অনুমান করে,
এবং অন্তত একটি এলিমেন্ট থেকে অনুপস্থিত যেকোনো কি-কে ? দিয়ে ঐচ্ছিক চিহ্নিত করে। এরপর প্রপার্টিটি সেই
মার্জ করা ইন্টারফেসের অ্যারে হিসেবে টাইপ করা হয় (উদাহরণস্বরূপ users: User[])। সাধারণত এটাই আপনি
চান, কারণ কোনো আসল API তালিকায় একই আকৃতির আইটেম থাকার কথা — তবে এর মানে এটাও যে একটি বিদঘুটে এলিমেন্ট
অনুমান করা টাইপ প্রশস্ত করে দিতে পারে, তাই কেবল প্রথম রেকর্ড নয়, বরং একটি প্রতিনিধিত্বমূলক নমুনা পেস্ট
করা ভালো।
Enum ও লিটারাল ইউনিয়ন
JSON-এ enum-এর কোনো ধারণা নেই, তাই কোনো ফিল্ড যার মান একটি নির্দিষ্ট সেটের একটি
হয় — কোনো স্ট্যাটাস, কোনো ভূমিকা, কোনো দেশ-কোড — একটি সাধারণ string হিসেবে আসে, এবং
এই টুলটি তাকে ঠিক তেমনই টাইপ করে। এমন ফিল্ড হাতে সংকীর্ণ করা সবচেয়ে মূল্যবান সম্পাদনাগুলোর একটি:
status: string-কে status: "draft" | "published" | "archived"
তে বদলান এবং কম্পাইলার এখন যেকোনো বানান-ভুল বা অবৈধ মান ধরে ফেলবে, যখন আপনার এডিটর অনুমোদিত
বিকল্পগুলো অটোকমপ্লিট করবে। TypeScript-এর একটি নিবেদিত enum কীওয়ার্ডও আছে, তবে
বেশিরভাগ আধুনিক কোডবেস উপরের মতো লিটারাল-ইউনিয়ন টাইপ-কে অগ্রাধিকার দেয়,
কারণ সেগুলো সরল, পরিষ্কারভাবে সাধারণ স্ট্রিংয়ে মুছে যায়, এবং JSON-এর সাথে ভালো চলে।
জানার মতো ইউটিলিটি টাইপ
একবার আপনার কাছে একটি সঠিক ইন্টারফেস থাকলে, TypeScript-এর অন্তর্নির্মিত ইউটিলিটি টাইপ
আপনাকে তাকে আবার না লিখেই নতুন আকার দিতে দেয়। Partial প্রতিটি প্রপার্টিকে ঐচ্ছিক
করে (কোনো "আপডেট" পেলোডের জন্য উপযোগী যেখানে যেকোনো ফিল্ড পাঠানো যেতে পারে);
Required এর উল্টোটা করে; Pick ও Omit কোনো বড়
টাইপের কয়েকটি ফিল্ড থেকে একটি ছোট টাইপ তৈরি করে; Readonly পরিবর্তন রোধ করে; এবং
Record স্ট্রিং-কি ওয়ালা ডিকশনারির বর্ণনা দেয়। এখানে বেস ইন্টারফেস জেনারেট করে
তারপর তা থেকে এই বৈচিত্র্যগুলো পাওয়া আপনার টাইপকে DRY রাখে — সত্যের একটি উৎস, অনেক আকৃতি —
যাতে অন্তর্নিহিত ডেটা-আকৃতিতে কোনো পরিবর্তন কেবল একটি জায়গায় করতে হয়।
একটি ব্যবহারিক ওয়ার্কফ্লো
একটি নির্ভরযোগ্য প্যাটার্ন হলো: আসল API একবার কল করুন, একটি প্রতিনিধিত্বমূলক রেসপন্স কপি করুন, তা
এখানে পেস্ট করুন, এবং রুট ইন্টারফেসের নাম এন্ডপয়েন্টের সাথে মেলান। স্পষ্ট enum-সদৃশ স্ট্রিংগুলোকে
লিটারাল ইউনিয়নে সংকীর্ণ করুন, ঐচ্ছিক চিহ্নগুলো API-এর ডকুমেন্টেশনের বিপরীতে নিশ্চিত করুন, এবং যেকোনো
unknown[]-কে আসল এলিমেন্ট-টাইপ দিয়ে বদলান। কোনো বিশ্বাস-সীমা পার করা
ডেটার জন্য, একই আকৃতিকে Zod বা JSON Schema ভ্যালিডেটর হিসেবে আবার তৈরি করুন যাতে রানটাইম যাচাই
ও স্ট্যাটিক টাইপ একসাথে থাকে। এভাবে করলে একটি JSON নমুনা ক্লান্তিকর হাতে-অনুবাদের বদলে কয়েক
মিনিটেই একটি সম্পূর্ণ টাইপড, ভ্যালিডেটেড মডেলে পরিণত হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
- এটি কি গভীরভাবে নেস্টেড অবজেক্ট সামলায়?
- হ্যাঁ। জেনারেটরটি সম্পূর্ণ JSON ট্রি পুনরাবৃত্তভাবে (recursive) ঘোরে। প্রতিটি নেস্টেড অবজেক্ট নিজের নামযুক্ত interface হয়ে ওঠে, এবং প্যারেন্ট ইন্টারফেসগুলো সেই চাইল্ড ইন্টারফেসগুলোকে নাম ধরে রেফার করে। ইন্টারফেসগুলো সবচেয়ে গভীর-আগে (deepest-first) নির্গত হয় যাতে আউটপুট উপর-থেকে-নিচে কোনো ফরওয়ার্ড রেফারেন্স ছাড়াই কম্পাইল হয়।
- মিশ্র টাইপের অ্যারের ক্ষেত্রে কী হয়?
- যখন কোনো অ্যারের সব এলিমেন্ট প্রিমিটিভ (string, number, boolean) হয়, তখন জেনারেটর একটি ইউনিয়ন অ্যারে টাইপ তৈরি করে যেমন (string | number)[]। যখন এলিমেন্টগুলো অবজেক্ট হয়, তখন এটি প্রতিটি এলিমেন্টে দেখা সব কি একত্র (merge) করে — কোনো কি যা কিছু এলিমেন্টে আছে কিন্তু সবগুলোতে নেই, তাকে ঐচ্ছিক (?) চিহ্নিত করা হয় যাতে টাইপটি অ্যারের সব আইটেমকে সঠিকভাবে উপস্থাপন করে।
- ? (ঐচ্ছিক) চিহ্নের মানে কী?
- ? দিয়ে চিহ্নিত প্রপার্টিটি ঐচ্ছিক — বাস্তবে এটি কিছু অবজেক্ট থেকে অনুপস্থিত থাকতে পারে। জেনারেটর তখন ? যোগ করে যখন নমুনা JSON-এ কোনো কি-এর ভ্যালু null থাকে (যা ইঙ্গিত করে আসল ভ্যালু অনুপস্থিত থাকতে পারে), অথবা যখন কোনো কি অবজেক্ট-অ্যারের কিছু কিন্তু সব এলিমেন্টে দেখা যায় না। TypeScript-এ, একটি ঐচ্ছিক প্রপার্টি অবজেক্ট থেকে পুরোপুরি অনুপস্থিত থাকতে পারে — এটি এমন প্রপার্টি থেকে আলাদা যা উপস্থিত কিন্তু স্পষ্টভাবে null।
- আমি কি এই আউটপুট সরাসরি TypeScript-এ ব্যবহার করতে পারি?
- হ্যাঁ। জেনারেট করা ইন্টারফেসগুলো মানক TypeScript সিনট্যাক্স ব্যবহার করে এবং export করা, তাই আপনি এগুলো সরাসরি কোনো .ts বা .d.ts ফাইলে পেস্ট করতে পারেন। আপনার ডোমেন-জ্ঞান অনুযায়ী ইন্টারফেসের নাম বদলাতে বা ঐচ্ছিকতা সমন্বয় করতে চাইতে পারেন — জেনারেটর একটিমাত্র নমুনা JSON থেকে টাইপ অনুমান করে, তাই প্রতিটি ক্ষেত্রে কোন ফিল্ড সত্যিই আবশ্যক তা এটি জানতে পারে না।
- অবজেক্টের অ্যারে আমি কীভাবে সামলাব?
- যখন কোনো অ্যারেতে অবজেক্ট থাকে, তখন জেনারেটর এলিমেন্ট-টাইপের জন্য একটি নামযুক্ত interface তৈরি করে — উদাহরণস্বরূপ, কি users: [{...}] একটি interface Users {...} তৈরি করে এবং প্রপার্টিটিকে users: Users[] টাইপ দেয়। যদি অ্যারের ভিন্ন ভিন্ন অবজেক্টে ভিন্ন কি থাকে, তাহলে সব কি মার্জ হয় এবং অন্তত একটি এলিমেন্ট থেকে অনুপস্থিত যেকোনো কি ঐচ্ছিক চিহ্নিত হয়।
- যদি আমার JSON-এ এমন কি থাকে যা বৈধ TypeScript আইডেন্টিফায়ার নয়, তাহলে?
- এমন কি যাতে স্পেস, হাইফেন, ডট আছে বা যা অঙ্ক দিয়ে শুরু হয়, বৈধ TypeScript আইডেন্টিফায়ার নয়। জেনারেটর এগুলো শনাক্ত করে উদ্ধৃতি-চিহ্নে মুড়ে দেয় — উদাহরণস্বরূপ "my-key"?: string — যা বৈধ TypeScript অবজেক্ট-টাইপ সিনট্যাক্স। এরপর আপনি এমন প্রপার্টি ব্র্যাকেট নোটেশন দিয়ে অ্যাক্সেস করতে পারেন: obj["my-key"]।
- এটি কি interface-এর বদলে Zod স্কিমা বা type অ্যালিয়াস আউটপুট দিতে পারে?
- হ্যাঁ। টুলের উপরের "আউটপুট" নির্বাচক থেকে টার্গেট TypeScript type অ্যালিয়াস বা Zod v3 স্কিমায় বদলান। Zod আউটপুট একই অনুমান করা আকৃতি থেকে তৈরি হয় — স্ট্রিং z.string() হয়, নম্বর z.number(), নেস্টেড অবজেক্ট z.object({...}), অ্যারে z.array(...) এবং ঐচ্ছিক কি .optional() পায় — এবং এতে import { z } from "zod" লাইন থাকে, তাই এটি পেস্ট করার জন্য প্রস্তুত। Zod তখন বেছে নিন যখন আপনার কেবল কম্পাইল-টাইম টাইপ নয়, রানটাইম ভ্যালিডেশন দরকার।