আপনি যদি জটিল ওয়েব অ্যাপ্লিকেশন তৈরি করেন, তাহলে টাইপস্ক্রিপ্ট সম্ভবত আপনার পছন্দের প্রোগ্রামিং ভাষা। TypeScript এর শক্তিশালী টাইপ সিস্টেম এবং স্ট্যাটিক বিশ্লেষণ ক্ষমতার জন্য ভালভাবে প্রিয়, এটি আপনার কোডটি শক্তিশালী এবং ত্রুটি-মুক্ত তা নিশ্চিত করার জন্য এটি একটি শক্তিশালী টুল তৈরি করে।
এটি কোড এডিটরদের সাথে একীকরণের মাধ্যমে উন্নয়ন প্রক্রিয়াকে ত্বরান্বিত করে, যা ডেভেলপারদের আরও দক্ষতার সাথে কোডটি নেভিগেট করতে এবং আরও সঠিক ইঙ্গিত এবং স্বয়ংক্রিয়-সম্পূর্ণতা পেতে দেয়, সেইসাথে প্রচুর পরিমাণে কোডের নিরাপদ রিফ্যাক্টরিং সক্ষম করে।
কম্পাইলার হল টাইপস্ক্রিপ্টের হৃদয়, টাইপ শুদ্ধতা পরীক্ষা করার জন্য এবং টাইপস্ক্রিপ্ট কোডকে জাভাস্ক্রিপ্টে রূপান্তর করার জন্য দায়ী। যাইহোক, TypeScript এর ক্ষমতা সম্পূর্ণরূপে ব্যবহার করার জন্য, কম্পাইলারটি সঠিকভাবে কনফিগার করা গুরুত্বপূর্ণ।
প্রতিটি TypeScript প্রজেক্টে এক বা একাধিক tsconfig.json
ফাইল থাকে যা কম্পাইলারের জন্য সমস্ত কনফিগারেশন অপশন ধারণ করে।
tsconfig কনফিগার করা আপনার TypeScript প্রকল্পগুলিতে সর্বোত্তম ধরনের নিরাপত্তা এবং বিকাশকারীর অভিজ্ঞতা অর্জনের একটি গুরুত্বপূর্ণ পদক্ষেপ। এর সাথে জড়িত সমস্ত মূল বিষয়গুলিকে সাবধানে বিবেচনা করার জন্য সময় নেওয়ার মাধ্যমে, আপনি বিকাশ প্রক্রিয়াটিকে দ্রুততর করতে পারেন এবং আপনার কোডটি শক্তিশালী এবং ত্রুটিমুক্ত তা নিশ্চিত করতে পারেন।
tsconfig-এ ডিফল্ট কনফিগারেশনের কারণে ডেভেলপাররা TypeScript-এর বেশিরভাগ সুবিধা মিস করতে পারে। কারণ এটি অনেক শক্তিশালী টাইপ-চেকিং ক্ষমতা সক্ষম করে না। "ডিফল্ট" কনফিগারেশন দ্বারা, আমি একটি কনফিগারেশন বলতে চাচ্ছি যেখানে কোনও টাইপ-চেকিং কম্পাইলার বিকল্প সেট করা নেই।
উদাহরণ স্বরূপ:
{ "compilerOptions": { "target": "esnext", "module": "esnext", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "skipLibCheck": true, }, "include": ["src"] }
কয়েকটি মূল কনফিগারেশন বিকল্পের অনুপস্থিতি দুটি প্রাথমিক কারণে কোডের গুণমান কম হতে পারে। প্রথমত, টাইপস্ক্রিপ্টের কম্পাইলার ভুলভাবে বিভিন্ন ক্ষেত্রে null
এবং undefined
প্রকারগুলি পরিচালনা করতে পারে।
দ্বিতীয়ত, any
প্রকার আপনার কোডবেসে অনিয়ন্ত্রিতভাবে উপস্থিত হতে পারে, যার ফলে এই ধরণের চারপাশে অক্ষম প্রকার পরীক্ষা করা হয়।
সৌভাগ্যবশত, কনফিগারেশনে কয়েকটি বিকল্প পরিবর্তন করে এই সমস্যাগুলি সমাধান করা সহজ।
{ "compilerOptions": { "strict": true } }
কঠোর মোড একটি অপরিহার্য কনফিগারেশন বিকল্প যা টাইপ-চেকিং আচরণের বিস্তৃত পরিসর সক্ষম করে প্রোগ্রামের সঠিকতার শক্তিশালী গ্যারান্টি প্রদান করে।
tsconfig ফাইলে কঠোর মোড সক্ষম করা সর্বাধিক ধরনের নিরাপত্তা এবং একটি উন্নত বিকাশকারী অভিজ্ঞতা অর্জনের দিকে একটি গুরুত্বপূর্ণ পদক্ষেপ।
এটি tsconfig কনফিগার করার জন্য একটু অতিরিক্ত প্রচেষ্টার প্রয়োজন, কিন্তু এটি আপনার প্রকল্পের গুণমান উন্নত করতে একটি দীর্ঘ পথ যেতে পারে।
strict
কম্পাইলার বিকল্পটি সমস্ত কঠোর মোড পারিবারিক বিকল্পগুলিকে সক্ষম করে, যার মধ্যে রয়েছে noImplicitAny
, strictNullChecks
, strictFunctionTypes
, অন্যদের মধ্যে।
এই বিকল্পগুলি আলাদাভাবেও কনফিগার করা যেতে পারে, তবে তাদের কোনোটি বন্ধ করার পরামর্শ দেওয়া হয় না। এর কারণ দেখতে উদাহরণ তাকান.
{ "compilerOptions": { "noImplicitAny": true } }
স্ট্যাটিক টাইপ সিস্টেমে any
প্রকার একটি বিপজ্জনক লুফেল, এবং এটি ব্যবহার করা সমস্ত প্রকার-পরীক্ষার নিয়মগুলিকে অক্ষম করে। ফলস্বরূপ, TypeScript-এর সমস্ত সুবিধা হারিয়ে গেছে: বাগগুলি মিস করা হয়েছে, কোড এডিটর ইঙ্গিতগুলি সঠিকভাবে কাজ করা বন্ধ করে দিয়েছে, ইত্যাদি।
শুধুমাত্র চরম ক্ষেত্রে বা প্রোটোটাইপিং প্রয়োজনের জন্য any
ব্যবহার করা ঠিক। আমাদের সর্বোত্তম প্রচেষ্টা সত্ত্বেও, যে any
প্রকার কখনও কখনও একটি কোডবেসের মধ্যে গোপনে লুকিয়ে যেতে পারে।
ডিফল্টরূপে, কম্পাইলার কোডবেসে any
উপস্থিতির বিনিময়ে আমাদের অনেক ত্রুটি ক্ষমা করে দেয়। বিশেষ করে, TypeScript আমাদের ভেরিয়েবলের ধরন নির্দিষ্ট না করার অনুমতি দেয়, এমনকি যখন টাইপটি স্বয়ংক্রিয়ভাবে অনুমান করা যায় না।
সমস্যা হল যে আমরা দুর্ঘটনাক্রমে একটি ভেরিয়েবলের ধরন উল্লেখ করতে ভুলে যেতে পারি, উদাহরণস্বরূপ, একটি ফাংশন আর্গুমেন্টে। একটি ত্রুটি দেখানোর পরিবর্তে, TypeScript স্বয়ংক্রিয়ভাবে ভেরিয়েবলের any
অনুমান করবে।
function parse(str) { // ^? any return str.split(''); } // TypeError: str.split is not a function const res1 = parse(42); const res2 = parse('hello'); // ^? any
noImplicitAny
কম্পাইলার বিকল্পটি সক্ষম করার ফলে কম্পাইলার সমস্ত স্থান হাইলাইট করবে যেখানে একটি ভেরিয়েবলের ধরন স্বয়ংক্রিয়ভাবে any
হিসাবে অনুমান করা হয়। আমাদের উদাহরণে, টাইপস্ক্রিপ্ট আমাদের ফাংশন আর্গুমেন্টের ধরন নির্দিষ্ট করতে অনুরোধ করবে।
function parse(str) { // ^ Error: Parameter 'str' implicitly has an 'any' type. return str.split(''); }
যখন আমরা টাইপটি নির্দিষ্ট করি, TypeScript দ্রুত একটি স্ট্রিং প্যারামিটারে একটি সংখ্যা পাস করার ত্রুটিটি ধরবে। ভেরিয়েবল res2
এ সংরক্ষিত ফাংশনের রিটার্ন মানও সঠিক টাইপ থাকবে।
function parse(str: string) { return str.split(''); } const res1 = parse(42); // ^ Error: Argument of type 'number' is not // assignable to parameter of type 'string' const res2 = parse('hello'); // ^? string[]
{ "compilerOptions": { "useUnknownInCatchVariables": true } }
useUnknownInCatchVariables
কনফিগার করা ট্রাই-ক্যাচ ব্লকে ব্যতিক্রমগুলির নিরাপদ পরিচালনার জন্য অনুমতি দেয়। ডিফল্টরূপে, টাইপস্ক্রিপ্ট অনুমান করে যে একটি ক্যাচ ব্লকের ত্রুটির ধরনটি any
, যা আমাদের ত্রুটির সাথে কিছু করতে দেয়।
উদাহরণ স্বরূপ, আমরা ধরা ত্রুটিটিকে এমন একটি লগিং ফাংশনে পাস করতে পারি যা Error
এর একটি উদাহরণ গ্রহণ করে।
function logError(err: Error) { // ... } try { return JSON.parse(userInput); } catch (err) { // ^? any logError(err); }
যাইহোক, বাস্তবে, ত্রুটির ধরন সম্পর্কে কোন গ্যারান্টি নেই, এবং ত্রুটিটি ঘটলেই আমরা রানটাইমে এটির প্রকৃত প্রকার নির্ধারণ করতে পারি। যদি লগিং ফাংশন এমন কিছু পায় যা একটি Error
নয়, তাহলে এটি একটি রানটাইম ত্রুটির কারণ হবে৷
সুতরাং, useUnknownInCatchVariables
বিকল্পটি ত্রুটির ধরনটিকে any
থেকে unknown
পরিবর্তন করে যা কিছু করার আগে ত্রুটির ধরনটি পরীক্ষা করার জন্য আমাদের স্মরণ করিয়ে দেয়।
try { return JSON.parse(userInput); } catch (err) { // ^? unknown // Now we need to check the type of the value if (err instanceof Error) { logError(err); } else { logError(new Error('Unknown Error')); } }
এখন, TypeScript আমাদেরকে logError
ফাংশনে পাস করার আগে err
ভেরিয়েবলের ধরন পরীক্ষা করতে বলবে, যার ফলে আরও সঠিক এবং নিরাপদ কোড পাওয়া যাবে। দুর্ভাগ্যবশত, এই বিকল্পটি promise.catch()
ফাংশন বা কলব্যাক ফাংশনে টাইপিং ত্রুটির ক্ষেত্রে সাহায্য করে না।
কিন্তু আমরা পরের প্রবন্ধে এই ধরনের any
ক্ষেত্রে মোকাবেলা করার উপায় নিয়ে আলোচনা করব।
{ "compilerOptions": { "strictBindCallApply": true } }
আরেকটি বিকল্প call
এবং apply
মাধ্যমে any
ইন-ফাংশন কলের উপস্থিতি ঠিক করে। এটি প্রথম দুটির তুলনায় একটি কম সাধারণ ঘটনা, তবে এটি এখনও বিবেচনা করা গুরুত্বপূর্ণ। ডিফল্টরূপে, TypeScript এই ধরনের নির্মাণে প্রকারগুলি পরীক্ষা করে না।
উদাহরণস্বরূপ, আমরা একটি ফাংশন একটি যুক্তি হিসাবে কিছু পাস করতে পারেন, এবং শেষ পর্যন্ত, আমরা সবসময় যে any
ধরনের পাবেন.
function parse(value: string) { return parseInt(value, 10); } const n1 = parse.call(undefined, '10'); // ^? any const n2 = parse.call(undefined, false); // ^? any
strictBindCallApply
বিকল্পটি সক্ষম করা টাইপস্ক্রিপ্টকে আরও স্মার্ট করে তোলে, তাই রিটার্নের ধরনটি সঠিকভাবে number
হিসাবে অনুমান করা হবে। এবং ভুল টাইপের একটি আর্গুমেন্ট পাস করার চেষ্টা করার সময়, টাইপস্ক্রিপ্ট ত্রুটিটি নির্দেশ করবে।
function parse(value: string) { return parseInt(value, 10); } const n1 = parse.call(undefined, '10'); // ^? number const n2 = parse.call(undefined, false); // ^ Argument of type 'boolean' is not // assignable to parameter of type 'string'.
{ "compilerOptions": { "noImplicitThis": true } }
পরবর্তী বিকল্প যা আপনার প্রজেক্টে যে any
উপস্থিতি রোধ করতে সাহায্য করতে পারে তা ফাংশন কলে এক্সিকিউশন কনটেক্সট হ্যান্ডলিং ঠিক করে। জাভাস্ক্রিপ্টের গতিশীল প্রকৃতি একটি ফাংশনের ভিতরে প্রসঙ্গটির ধরণকে স্ট্যাটিকভাবে নির্ধারণ করা কঠিন করে তোলে।
ডিফল্টরূপে, TypeScript এই ধরনের ক্ষেত্রে প্রেক্ষাপটের জন্য any
প্রকার ব্যবহার করে এবং কোনো সতর্কতা প্রদান করে না।
class Person { private name: string; constructor(name: string) { this.name = name; } getName() { return function () { return this.name; // ^ 'this' implicitly has type 'any' because // it does not have a type annotation. }; } }
noImplicitThis
কম্পাইলার বিকল্পটি সক্রিয় করা আমাদেরকে একটি ফাংশনের জন্য প্রসঙ্গটির ধরন স্পষ্টভাবে উল্লেখ করতে অনুরোধ করবে। এইভাবে, উপরের উদাহরণে, আমরা Person
শ্রেণীর name
ক্ষেত্রের পরিবর্তে ফাংশন প্রসঙ্গ অ্যাক্সেস করার ত্রুটিটি ধরতে পারি।
{ "compilerOptions": { "strictNullChecks": true } }
পরবর্তী বেশ কয়েকটি বিকল্প যা strict
মোডে অন্তর্ভুক্ত করা হয়েছে তার ফলে কোডবেসে any
প্রকার উপস্থিত হয় না। যাইহোক, তারা TS কম্পাইলারের আচরণকে কঠোর করে তোলে এবং বিকাশের সময় আরও ত্রুটি খুঁজে পাওয়ার অনুমতি দেয়।
এই ধরনের প্রথম বিকল্পটি TypeScript-এ null
এবং undefined
এর হ্যান্ডলিং ঠিক করে। ডিফল্টরূপে, TypeScript অনুমান করে যে null
এবং undefined
যেকোনো ধরনের জন্য বৈধ মান, যার ফলে অপ্রত্যাশিত রানটাইম ত্রুটি হতে পারে।
strictNullChecks
কম্পাইলার বিকল্পটি সক্রিয় করা বিকাশকারীকে স্পষ্টভাবে এমন ক্ষেত্রে পরিচালনা করতে বাধ্য করে যেখানে null
এবং undefined
ঘটতে পারে।
উদাহরণস্বরূপ, নিম্নলিখিত কোড বিবেচনা করুন:
const users = [ { name: 'Oby', age: 12 }, { name: 'Heera', age: 32 }, ]; const loggedInUser = users.find(u => u.name === 'Max'); // ^? { name: string; age: number; } console.log(loggedInUser.age); // ^ TypeError: Cannot read properties of undefined
এই কোডটি ত্রুটি ছাড়াই কম্পাইল করবে, তবে এটি একটি রানটাইম ত্রুটি নিক্ষেপ করতে পারে যদি "ম্যাক্স" নামের ব্যবহারকারী সিস্টেমে বিদ্যমান না থাকে এবং users.find()
undefined
ফেরত দেয়। এটি প্রতিরোধ করতে, আমরা strictNullChecks
কম্পাইলার বিকল্পটি সক্ষম করতে পারি।
এখন, TypeScript users.find()
দ্বারা null
বা undefined
ফেরত দেওয়ার সম্ভাবনাকে স্পষ্টভাবে পরিচালনা করতে বাধ্য করবে।
const loggedInUser = users.find(u => u.name === 'Max'); // ^? { name: string; age: number; } | undefined if (loggedInUser) { console.log(loggedInUser.age); }
null
এবং undefiined
এর সম্ভাবনাকে সুস্পষ্টভাবে পরিচালনা করে, আমরা রানটাইম ত্রুটিগুলি এড়াতে পারি এবং নিশ্চিত করতে পারি যে আমাদের কোড আরও শক্তিশালী এবং ত্রুটি-মুক্ত।
{ "compilerOptions": { "strictFunctionTypes": true } }
strictFunctionTypes
সক্ষম করা TypeScript এর কম্পাইলারকে আরও বুদ্ধিমান করে তোলে। সংস্করণ 2.6 এর আগে, TypeScript ফাংশন আর্গুমেন্টের বৈপরীত্য পরীক্ষা করেনি। এটি রানটাইম ত্রুটির দিকে পরিচালিত করবে যদি ফাংশনটি ভুল ধরণের যুক্তি দিয়ে কল করা হয়।
উদাহরণস্বরূপ, এমনকি যদি একটি ফাংশন টাইপ স্ট্রিং এবং সংখ্যা উভয়ই পরিচালনা করতে সক্ষম হয়, আমরা সেই ধরনের একটি ফাংশন বরাদ্দ করতে পারি যা শুধুমাত্র স্ট্রিংগুলি পরিচালনা করতে পারে। আমরা এখনও সেই ফাংশনে একটি নম্বর পাস করতে পারি, কিন্তু আমরা একটি রানটাইম ত্রুটি পাব।
function greet(x: string) { console.log("Hello, " + x.toLowerCase()); } type StringOrNumberFn = (y: string | number) => void; // Incorrect Assignment const func: StringOrNumberFn = greet; // TypeError: x.toLowerCase is not a function func(10);
সৌভাগ্যবশত, strictFunctionTypes
বিকল্পটি সক্রিয় করা এই আচরণকে ঠিক করে, এবং কম্পাইলার কম্পাইল-টাইমে এই ত্রুটিগুলি ধরতে পারে, আমাদের ফাংশনে টাইপের অসঙ্গতির একটি বিস্তারিত বার্তা দেখায়।
const func: StringOrNumberFn = greet; // ^ Type '(x: string) => void' is not assignable to type 'StringOrNumberFn'. // Types of parameters 'x' and 'y' are incompatible. // Type 'string | number' is not assignable to type 'string'. // Type 'number' is not assignable to type 'string'.
{ "compilerOptions": { "strictPropertyInitialization": true } }
শেষ কিন্তু অন্তত নয়, strictPropertyInitialization
বিকল্পটি মান হিসাবে undefined
অন্তর্ভুক্ত নয় এমন প্রকারের জন্য বাধ্যতামূলক শ্রেণি সম্পত্তি প্রারম্ভিকতা পরীক্ষা করতে সক্ষম করে।
উদাহরণস্বরূপ, নিম্নলিখিত কোডে, বিকাশকারী email
সম্পত্তি শুরু করতে ভুলে গেছেন। ডিফল্টরূপে, TypeScript এই ত্রুটি সনাক্ত করবে না, এবং রানটাইমে একটি সমস্যা ঘটতে পারে।
class UserAccount { name: string; email: string; constructor(name: string) { this.name = name; // Forgot to assign a value to this.email } }
যাইহোক, যখন strictPropertyInitialization
বিকল্পটি সক্রিয় থাকে, TypeScript আমাদের জন্য এই সমস্যাটিকে হাইলাইট করবে।
email: string; // ^ Error: Property 'email' has no initializer and // is not definitely assigned in the constructor.
{ "compilerOptions": { "noUncheckedIndexedAccess": true } }
noUncheckedIndexedAccess
বিকল্পটি strict
মোডের একটি অংশ নয়, তবে এটি আরেকটি বিকল্প যা আপনার প্রকল্পে কোডের গুণমান উন্নত করতে সাহায্য করতে পারে। এটি একটি null
বা undefined
রিটার্ন টাইপ থাকতে সূচক অ্যাক্সেস এক্সপ্রেশনের পরীক্ষা করতে সক্ষম করে, যা রানটাইম ত্রুটি প্রতিরোধ করতে পারে।
নিম্নলিখিত উদাহরণটি বিবেচনা করুন, যেখানে ক্যাশে মান সংরক্ষণ করার জন্য আমাদের কাছে একটি বস্তু রয়েছে। তারপরে আমরা কীগুলির একটির মান পাই। অবশ্যই, আমাদের কোন গ্যারান্টি নেই যে কাঙ্ক্ষিত কীটির মান আসলে ক্যাশে বিদ্যমান।
ডিফল্টরূপে, টাইপস্ক্রিপ্ট অনুমান করবে যে মানটি বিদ্যমান এবং টাইপ string
রয়েছে। এটি একটি রানটাইম ত্রুটি হতে পারে.
const cache: Record<string, string> = {}; const value = cache['key']; // ^? string console.log(value.toUpperCase()); // ^ TypeError: Cannot read properties of undefined
TypeScript-এ noUncheckedIndexedAccess
বিকল্পটি সক্ষম করার জন্য undefined
রিটার্ন টাইপের জন্য ইনডেক্স অ্যাক্সেস এক্সপ্রেশন পরীক্ষা করা প্রয়োজন, যা আমাদের রানটাইম ত্রুটিগুলি এড়াতে সাহায্য করতে পারে। এটি একটি অ্যারের উপাদানগুলি অ্যাক্সেস করার ক্ষেত্রেও প্রযোজ্য।
const cache: Record<string, string> = {}; const value = cache['key']; // ^? string | undefined if (value) { console.log(value.toUpperCase()); }
আলোচিত বিকল্পগুলির উপর ভিত্তি করে, সর্বোত্তম প্রকারের নিরাপত্তার জন্য আপনার প্রকল্পের tsconfig.json
ফাইলে strict
এবং noUncheckedIndexedAccess
বিকল্পগুলি সক্রিয় করার জন্য এটি অত্যন্ত সুপারিশ করা হয়।
{ "compilerOptions": { "strict": true, "noUncheckedIndexedAccess": true, } }
আপনি যদি ইতিমধ্যে strict
বিকল্পটি সক্রিয় করে থাকেন, তাহলে strict: true
বিকল্পের নকল এড়াতে আপনি নিম্নলিখিত বিকল্পগুলি সরানোর কথা বিবেচনা করতে পারেন:
noImplicitAny
useUnknownInCatchVariables
strictBindCallApply
noImplicitThis
strictFunctionTypes
strictNullChecks
strictPropertyInitialization
নিম্নলিখিত বিকল্পগুলিকে সরিয়ে ফেলারও সুপারিশ করা হয় যা টাইপ সিস্টেমকে দুর্বল করতে পারে বা রানটাইম ত্রুটির কারণ হতে পারে:
keyofStringsOnly
noStrictGenericChecks
suppressImplicitAnyIndexErrors
suppressExcessPropertyErrors
এই বিকল্পগুলিকে সাবধানে বিবেচনা করে এবং কনফিগার করার মাধ্যমে, আপনি আপনার টাইপস্ক্রিপ্ট প্রকল্পগুলিতে সর্বোত্তম ধরনের নিরাপত্তা এবং একটি উন্নত বিকাশকারী অভিজ্ঞতা অর্জন করতে পারেন।
TypeScript এর বিবর্তনে অনেক দূর এগিয়েছে, ক্রমাগত এর কম্পাইলার এবং টাইপ সিস্টেমকে উন্নত করছে। যাইহোক, পশ্চাদগামী সামঞ্জস্য বজায় রাখার জন্য, টাইপস্ক্রিপ্ট কনফিগারেশন আরও জটিল হয়ে উঠেছে, অনেকগুলি বিকল্প রয়েছে যা টাইপ চেকিংয়ের গুণমানকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে।
এই বিকল্পগুলিকে সাবধানে বিবেচনা করে এবং কনফিগার করার মাধ্যমে, আপনি আপনার টাইপস্ক্রিপ্ট প্রকল্পগুলিতে সর্বোত্তম ধরনের নিরাপত্তা এবং একটি উন্নত বিকাশকারী অভিজ্ঞতা অর্জন করতে পারেন। কোন প্রজেক্ট কনফিগারেশন থেকে কোন অপশনগুলিকে সক্রিয় এবং অপসারণ করতে হবে তা জানা গুরুত্বপূর্ণ।
নির্দিষ্ট বিকল্পগুলি অক্ষম করার পরিণতিগুলি বোঝার ফলে আপনি প্রতিটির জন্য সচেতন সিদ্ধান্ত নিতে পারবেন।
এটা মনে রাখা গুরুত্বপূর্ণ যে কঠোর টাইপিং এর পরিণতি হতে পারে। কার্যকরীভাবে জাভাস্ক্রিপ্টের গতিশীল প্রকৃতির সাথে মোকাবিলা করার জন্য, আপনাকে একটি ভেরিয়েবলের পরে "সংখ্যা" বা "স্ট্রিং" উল্লেখ করার বাইরেও টাইপস্ক্রিপ্ট সম্পর্কে ভাল বোঝার প্রয়োজন হবে।
টাইপ-সম্পর্কিত সমস্যাগুলি আরও কার্যকরভাবে সমাধান করার জন্য আপনাকে আরও জটিল নির্মাণ এবং লাইব্রেরি এবং সরঞ্জামগুলির টাইপস্ক্রিপ্ট-প্রথম বাস্তুতন্ত্রের সাথে পরিচিত হতে হবে।
ফলস্বরূপ, কোড লেখার জন্য একটু বেশি প্রচেষ্টার প্রয়োজন হতে পারে, তবে আমার অভিজ্ঞতার ভিত্তিতে, দীর্ঘমেয়াদী প্রকল্পগুলির জন্য এই প্রচেষ্টাটি মূল্যবান।
আমি আশা করি আপনি এই নিবন্ধ থেকে নতুন কিছু শিখেছি. এটি একটি সিরিজের প্রথম পর্ব। পরবর্তী প্রবন্ধে, আমরা আলোচনা করব কিভাবে TypeScript-এর স্ট্যান্ডার্ড লাইব্রেরিতে প্রকারগুলিকে উন্নত করে উন্নত ধরনের নিরাপত্তা এবং কোডের গুণমান অর্জন করা যায়। সাথে থাকুন, এবং পড়ার জন্য ধন্যবাদ!