JSON Toolkit

Schema থেকে TypeScript টাইপ জেনারেট করা

সংক্ষেপে: json-schema-to-typescript ও quicktype এক কমান্ডে .d.ts দেয়, কিন্তু তা খসড়া: optionality, union, additionalProperties ও তারিখে মানুষের হাত দরকার।

মধ্যবর্তী~4 মিনিট পড়াপ্রকাশ 2026-10-30আপডেট 2026-10-30
JSON Schema থেকে TypeScript টাইপ জেনারেশন

মূল কথা: json-schema-to-typescript বা quicktype দিয়ে জেনারেট করুন, তারপর optionality, union, additionalProperties ও তারিখ হাতে ঠিক করুন; Schema উৎস আর টাইপ আউটপুট রাখুন, যা CI-তে types:check ধাপ দিয়ে বলবৎ করুন।

এক কমান্ডে ফাইল পাবেন। সঠিক টাইপ পাবেন না।

এক-লাইনার

npx json-schema-to-typescript schema.json > src/types/order.d.ts

এটি $ref, allOf, oneOf, anyOf সামলায়, আর description-কে JSDoc করে। ব্যানার ও নির্দিষ্ট style নিয়ে ব্যাচ জেনারেশনের জন্য ছোট build-types.mjs থেকে এর Node API কল করুন।

quicktype বিকল্প, যা নমুনা JSON থেকে স্কিমাও অনুমান করতে পারে:

npx quicktype -s schema schema.json -o order.ts --lang typescript

পরে ঠিক করার চারটি জিনিস

Optionality। required-এ না থাকা যেকোনো কিছু ? হয়। কিন্তু "সবসময় উপস্থিত, null হতে পারে" আর "অনুপস্থিত হতে পারে" আলাদা চুক্তি:

interface Order {
  remark?: string | null;   // may be missing
  status: string;
}

ব্যাকএন্ড সবসময় remark: null পাঠালে ? বাদ দিন আর প্রতিটি ভোক্তাকে undefined পাহারা দেওয়া বন্ধ করুন।

Undiscriminated union। oneOf সাধারণত A | B হয়, যা TypeScript লিটেরাল ফিল্ড ছাড়া সংকুচিত করতে পারে না। Schema-তে প্রতিটি শাখায় স্থির type প্রপার্টি যোগ করুন।

additionalProperties। বাদ দেওয়া বা true কখনো [k: string]: unknown দেয়, কখনো any। প্রথমটি নিরাপদ, দ্বিতীয়টি পুরো অবজেক্টের টাইপ চেকিং নীরবে বন্ধ করে।

তারিখ ফরম্যাট। format: "date-time" তারে স্ট্রিং। Date-এ ম্যাপ করলে deserialization-ও করতে হবে, নাহলে রানটাইম মান স্ট্রিং থাকে অথচ টাইপ মিথ্যা বলে।

দিক স্থির রাখুন

Schema উৎস, টাইপ আউটপুট। হাতে লেখা টাইপ থেকে Schema জেনারেট করা কেবল তখনই গ্রহণযোগ্য যখন পুনর্জেনারেশন বাধ্যতামূলক ও CI-তে বলবৎ — নাহলে দুই পক্ষ সরে যায় আর কেউ জানে না কোনটি কর্তৃত্বপূর্ণ।

পাইপলাইনে বসান

"types:gen": "json2ts -i schemas/ -o src/types/generated",
"types:check": "pnpm types:gen && git diff --exit-code src/types/generated"

types:check-ই আসল অংশ: Schema বদলে পুনর্জেনারেট না করলে CI ব্যর্থ হয়।

সাধারণ প্রশ্ন

জেনারেট করা ফাইলে any থাকে কেন?

সাধারণত additionalProperties true বা বাদ দেওয়া থেকে আসে, যা কিছু জেনারেটর [k: string]: any-তে ম্যাপ করে। এটি unknown বা স্পষ্ট ফিল্ড দিয়ে বদলান, কারণ any পুরো অবজেক্টের টাইপ চেকিং বন্ধ করে।

জেনারেশনের পর ঐচ্ছিক ফিল্ড কীভাবে ঠিক করব?

required-এর বাইরের যেকোনো কিছু ? হয়, কিন্তু "সবসময় উপস্থিত, null হতে পারে" আর "অনুপস্থিত হতে পারে" আলাদা। ব্যাকএন্ড ফিল্ড সবসময় পাঠালে ? বাদ দিন।

Schema ও টাইপ সরে গেলে CI ব্যর্থ হওয়া উচিত?

হ্যাঁ। পুনর্জেনারেট করে git diff --exit-code চালানো types:check স্ক্রিপ্ট Schema পুনর্জেনারেশন ছাড়া বদলালেই বিল্ড ব্যর্থ করে।

আরও পড়ুন