দুর্ভাগ্যক্রমে এই জিনিসগুলি বর্তমানে খুব ভালভাবে নথিভুক্ত করা হয়নি, তবে আপনি এটির কাজটি করতে সক্ষম হলেও, আসুন আপনার কনফিগারেশনটি এগিয়ে চলুন যাতে আপনি বুঝতে পারবেন যে প্রতিটি অংশ কী করছে এবং এটি কীভাবে টাইপস্ক্রিপ্ট প্রক্রিয়া এবং টাইপগুলি বোঝায় তার সাথে সম্পর্কিত।
প্রথমে আপনি যে ত্রুটিটি পাচ্ছেন তার উপর নজর দেওয়া যাক:
error TS2688: Cannot find type definition file for 'lodash'.
এই ত্রুটিটি আসলে আপনার আমদানি বা রেফারেন্সগুলি থেকে আসে না বা আপনার টিএস ফাইলে যে কোনও জায়গায় লোডাশ ব্যবহার করার চেষ্টা করে। বরং এটি কীভাবে সম্পত্তি typeRootsএবং typesবৈশিষ্ট্যগুলি ব্যবহার করবেন সে সম্পর্কে একটি ভুল বোঝাবুঝি থেকে আসে , সুতরাং আসুন সেগুলির বিষয়ে আরও কিছু বিশদে যাওয়া যাক।
সম্পর্কে জিনিস typeRoots:[]এবং types:[]বৈশিষ্ট্য যে তারা হয় না সাধারণ উপায়ে নির্বিচারে ঘোষণা (লোড করতে *.d.ts) ফাইল।
এই দুটি বৈশিষ্ট্য সরাসরি নতুন টিএস 2.0 বৈশিষ্ট্যের সাথে সম্পর্কিত যা এনপিএম প্যাকেজগুলি থেকে প্যাকেজিং এবং লোড টাইপিং ঘোষণার মঞ্জুরি দেয় ।
এটি বোঝার জন্য অত্যন্ত গুরুত্বপূর্ণ যে এগুলি কেবলমাত্র এনপিএম ফর্ম্যাটে ফোল্ডারগুলির সাথে কাজ করে (যেমন একটি ফোল্ডার যা একটি প্যাকেজ.জসন বা index.d.ts রয়েছে )।
এর জন্য ডিফল্ট typeRootsহ'ল:
{
"typeRoots" : ["node_modules/@types"]
}
ডিফল্টরূপে এর অর্থ হ'ল টাইপস্ক্রিপ্ট node_modules/@typesফোল্ডারে যাবে এবং এটি এনপিএম প্যাকেজ হিসাবে খুঁজে পাওয়া প্রতিটি উপ-ফোল্ডার লোড করার চেষ্টা করবে ।
এটি বুঝতে গুরুত্বপূর্ণ যে কোনও ফোল্ডারে এনপিএম প্যাকেজের মতো কাঠামো না থাকলে এটি ব্যর্থ হবে।
আপনার ক্ষেত্রে এটি ঘটছে এবং এটি আপনার প্রাথমিক ত্রুটির উত্স।
আপনি টাইপ রুট হতে সুইচ করেছেন:
{
"typeRoots" : ["./typings"]
}
এর অর্থ হ'ল টাইপস্ক্রিপ্ট এখন সাবফোল্ডারগুলির./typings জন্য ফোল্ডারটি স্ক্যান করবে এবং এটি এনপিএম মডিউল হিসাবে পাওয়া প্রতিটি সাবফোল্ডার লোড করার চেষ্টা করবে।
সুতরাং আসুন আপনি ভেবে দেখান যে আপনি ঠিক আছে typeRootsসেটআপ করার জন্য নির্দেশিত ./typingsকিন্তু এখনও কোন types:[]সম্পত্তি সেটআপ আছে। আপনি সম্ভবত এই ত্রুটিগুলি দেখতে পাবেন:
error TS2688: Cannot find type definition file for 'custom'.
error TS2688: Cannot find type definition file for 'global'.
এটি কারণ tscআপনার ./typingsফোল্ডারটি স্ক্যান করছে এবং উপ-ফোল্ডারগুলি সন্ধান করছে customএবং global। এরপরে এটি এনপিএম প্যাকেজ-টাইপ টাইপিং হিসাবে ব্যাখ্যা করার চেষ্টা করা হচ্ছে, তবে এই ফোল্ডারগুলিতে কোনও index.d.tsবা নেই package.jsonএবং তাই আপনি ত্রুটি পান।
এখন types: ['lodash']আপনি যে সম্পত্তিটি সেট করছেন সে সম্পর্কে কিছুটা কথা বলা যাক । এটি কি করে? ডিফল্টরূপে, টাইপস্ক্রিপ্ট এটি আপনার মধ্যে পাওয়া সমস্ত সাব-ফোল্ডার লোড করবে typeRoots। আপনি যদি কোনও types:সম্পত্তি নির্দিষ্ট করেন তবে এটি কেবলমাত্র সেই নির্দিষ্ট সাব-ফোল্ডারগুলি লোড করবে।
আপনার ক্ষেত্রে আপনি এটি ./typings/lodashফোল্ডারটি লোড করতে বলছেন তবে এটি বিদ্যমান নেই। এই কারণেই আপনি পান:
error TS2688: Cannot find type definition file for 'lodash'
সুতরাং আসুন আমরা কি শিখেছি সংক্ষেপে। টাইপস্ক্রিপ্ট ২.০ প্রবর্তিত হয়েছে typeRootsএবং এনপিএম প্যাকেজেtypes প্যাকেজড ডিক্লেয়ারেশন ফাইলগুলি লোড করার জন্য । আপনার যদি কাস্টম টাইপিং বা একক আলগা ফাইল রয়েছে যা এনপিএম প্যাকেজ কনভেনশন অনুসরণ করে কোনও ফোল্ডারে অন্তর্ভুক্ত নেই, তবে এই দুটি নতুন বৈশিষ্ট্য আপনি ব্যবহার করতে চান তা নয়। টাইপসক্রিপ্ট ২.০ আসলে কীভাবে এটি ব্যবহার করা হবে তা পরিবর্তন করে না। আপনাকে কেবলমাত্র অনেকগুলি মানক উপায়ের মধ্যে এই সংকলন প্রসঙ্গে এই ফাইলগুলি অন্তর্ভুক্ত করতে হবে:d.ts
এটি সরাসরি কোনও .tsফাইলে অন্তর্ভুক্ত করুন:
///<reference path="../typings/custom/lodash.d.ts" />
./typings/custom/lodash.d.tsআপনার files: []সম্পত্তি সহ ।
সহ ./typings/index.d.tsআপনার files: []সম্পত্তি (যা পরে যাও recursively অন্যান্য typings অন্তর্ভুক্ত করা হয়েছে।
./typings/**আপনার যুক্ত করা হচ্ছেincludes:
আশা করি, এই আলোচনার ভিত্তিতে আপনি বলতে পারবেন যে আপনি নিজের tsconfig.jsonতৈরি জিনিসগুলিতে পাগল হওয়া পরিবর্তনগুলি কেন আবার কাজ করে।
সম্পাদনা:
একটি জিনিস যা আমি উল্লেখ করতে ভুলে গেছি তা হ'ল typeRootsএবং typesসম্পত্তি বিশ্বব্যাপী ঘোষণাগুলি স্বয়ংক্রিয়ভাবে লোড করার জন্য কেবল কার্যকর ।
উদাহরণস্বরূপ যদি আপনি
npm install @types/jquery
এবং আপনি ডিফল্ট tsconfig ব্যবহার করছেন, তারপরে সেই jquery প্রকারের প্যাকেজটি স্বয়ংক্রিয়ভাবে লোড হবে এবং $আপনার সমস্ত স্ক্রিপ্টগুলিতে উপলব্ধ হবে যে আরও কিছু করতে হবে না ///<reference/>বাimport
typeRoots:[]সম্পত্তি যেখানে টাইপ থেকে অতিরিক্ত অবস্থান জুড়তে বোঝানো হয় প্যাকেজ স্বয়ংক্রিয়ভাবে frrom লোড হবে।
types:[]সম্পত্তি প্রাথমিক ব্যবহার-কেস স্বয়ংক্রিয় লোড আচরণ নিষ্ক্রিয় করতে (একটি খালি অ্যারে থেকে এটি সেটিং দ্বারা) হল, এবং তারপর শুধুমাত্র আপনি বিশ্বব্যাপী অন্তর্ভুক্ত করতে চান নির্দিষ্ট ধরনের তালিকা।
বিভিন্ন থেকে টাইপ প্যাকেজ লোড করার অন্য উপায়টি typeRootsহ'ল নতুন ///<reference types="jquery" />নির্দেশিকা ব্যবহার করা । typesপরিবর্তে লক্ষ্য করুন path। আবার, এটি কেবল গ্লোবাল ডিক্লেয়ারেশন ফাইলগুলির জন্য দরকারী, সাধারণত যেগুলি না করে import/export।
এখন, এখানে এমন একটি জিনিস যা বিভ্রান্তির কারণ হয় typeRoots। মনে রাখবেন, আমি বলেছিলাম যে typeRootsএটি মডিউলগুলির বিশ্বব্যাপী অন্তর্ভুক্তি সম্পর্কে। তবে @types/folderস্ট্যান্ডার্ড মডিউল-রেজোলিউশনেও জড়িত (আপনার typeRootsসেটিং নির্বিশেষে )।
বিশেষ করে, স্পষ্টভাবে আমদানি মডিউল সবসময় সব রোধ করা যাবে includes, excludes, files, typeRootsএবং typesঅপশন। সুতরাং আপনি যখন করবেন:
import {MyType} from 'my-module';
উল্লিখিত সমস্ত বৈশিষ্ট্য সম্পূর্ণ উপেক্ষা করা হয়। চলাকালীন এর সাথে প্রাসঙ্গিক বৈশিষ্ট্য মডিউল রেজল্যুশন আছে baseUrl, pathsএবং moduleResolution।
মূলত, যখন ব্যবহার nodeমডিউল রেজল্যুশন, এটা অনুসন্ধানের একটি ফাইল নামের জন্য শুরু হবে my-module.ts, my-module.tsx, my-module.d.tsফোল্ডারের থেকে শুরু আপনার দ্বারা প্রতি ইঙ্গিত baseUrlকনফিগারেশন।
এটা ফাইল খুঁজে না ফেলেন, তাহলে এটি নামে একটি ফোল্ডার জন্য চেহারা হবে my-moduleএবং তারপর একটি অনুসন্ধান package.jsonএকটি সঙ্গে typingsসম্পত্তি, আছে যদি package.jsonবা কোন typingsএটি কহন ভিতরে সম্পত্তি যা ফাইল লোড করতে তাহলে অনুসন্ধান করবে index.ts/tsx/d.tsযে ফোল্ডারে মধ্যে।
যদি এটি এখনও সফল না হয় তবে এটি node_modulesআপনার থেকে শুরু হওয়া ফোল্ডারে এই একই জিনিসগুলি অনুসন্ধান করবে baseUrl/node_modules।
তদ্ব্যতীত, যদি এটি এগুলি না পায় তবে এটি baseUrl/node_modules/@typesএকই জিনিসগুলির জন্য অনুসন্ধান করবে ।
যদি এটি এখনও কিছু না পেয়ে থাকে তবে এটি পিতামাতার ডিরেক্টরিতে node_modulesএবং node_modules/@typesসেখানে অনুসন্ধান শুরু করবে । এটি আপনার ফাইল সিস্টেমের মূল পর্যন্ত পৌঁছে না দেওয়া পর্যন্ত ডিরেক্টরিগুলি চালিয়ে যেতে থাকবে (এমনকি আপনার প্রকল্পের বাইরে নোড-মডিউল পেতেও)।
একটা জিনিস আমি জোর দিতে চাই তা হল মডিউল রেজোলিউশন typeRootsআপনার সেট করা যে কোনওটিকে পুরোপুরি উপেক্ষা করে । সুতরাং আপনি যদি কনফিগার typeRoots: ["./my-types"]করেন তবে সুস্পষ্ট মডিউল রেজোলিউশনের সময় এটি অনুসন্ধান করা হবে না। এটি কেবলমাত্র একটি ফোল্ডার হিসাবে কাজ করে যেখানে আপনি বিশ্বব্যাপী সংজ্ঞা ফাইলগুলি রাখতে পারেন যা আপনি পুরো অ্যাপ্লিকেশনটিতে আমদানি বা রেফারেন্সের প্রয়োজন ছাড়াই উপলব্ধ করতে চান।
শেষ অবধি, আপনি প্যাথ ম্যাপিংস (অর্থাত্ pathsসম্পত্তি) এর সাথে মডিউল আচরণটি ওভাররাইড করতে পারেন । সুতরাং উদাহরণস্বরূপ, আমি উল্লেখ করেছি যে typeRootsমডিউলটি সমাধান করার চেষ্টা করার সময় কোনও কাস্টমসের সাথে পরামর্শ করা হয় না। তবে আপনি যদি পছন্দ করেন তবে আপনি এই আচরণটি ঘটতে পারেন:
"paths" :{
"*": ["my-custom-types/*", "*"]
}
এটি যা করে সেই সমস্ত আমদানির জন্য যা বাম-হাতের সাথে মিলে যায়, আমদানিটি অন্তর্ভুক্ত করার চেষ্টা করার আগে ডানদিকের মতো পরিবর্তন করার চেষ্টা *করুন ( ডানদিকে থাকাটি আপনার প্রাথমিক আমদানি স্ট্রিংকে উপস্থাপন করে example উদাহরণস্বরূপ যদি আপনি আমদানি করেন:
import {MyType} from 'my-types';
এটি প্রথমে আমদানির চেষ্টা করবে যেমন আপনি লিখেছেন:
import {MyType} from 'my-custom-types/my-types'
এবং তারপরে এটি যদি না খুঁজে পাওয়া যায় তবে উপসর্গটি ছাড়াই আবার চেষ্টা করবে (অ্যারের দ্বিতীয় আইটেমটি *যার অর্থ প্রাথমিক আমদানি।
সুতরাং আপনি কাস্টম ডিক্লেয়ারেশন ফাইলগুলি বা এমনকি .tsআপনি যে কাস্টম মডিউলগুলি সক্ষম করতে চান তা অনুসন্ধান করতে অতিরিক্ত ফোল্ডার যুক্ত করতে পারেন import।
আপনি নির্দিষ্ট মডিউলগুলির জন্য কাস্টম ম্যাপিংগুলিও তৈরি করতে পারেন:
"paths" :{
"*": ["my-types", "some/custom/folder/location/my-awesome-types-file"]
}
এটি আপনাকে করতে দেয়
import {MyType} from 'my-types';
তবে তারপরে এই ধরণের পড়ুন some/custom/folder/location/my-awesome-types-file.d.ts
pathsএবং কীভাবে এটি আলাদাinclude?