कोणत्याही जावास्क्रिप्ट लायब्ररीसाठी टाइप सेफ्टी आणि ऑटो कंप्लीशन अनलॉक करण्यासाठी टाइपस्क्रिप्ट डिक्लेरेशन फाइल्स (.d.ts) मध्ये प्रभुत्व मिळवा. @types वापरण्यास शिका, स्वतःच्या व्याख्या तयार करा.
जावास्क्रिप्ट इकोसिस्टम अनलॉक करणे: टाइपस्क्रिप्ट डिक्लेरेशन फाइल्समध्ये एक सखोल अभ्यास
जावास्क्रिप्टच्या डायनॅमिक जगात स्टॅटिक टाइपिंग आणून टाइपस्क्रिप्टने आधुनिक वेब डेव्हलपमेंटमध्ये क्रांती घडवली आहे. हे टाइप सेफ्टी अविश्वसनीय फायदे देते: कंपाइल-टाइममध्ये त्रुटी पकडणे, शक्तिशाली एडिटर ऑटो कंप्लीशन सक्षम करणे आणि मोठ्या कोडबेस अधिक व्यवस्थापित करणे. तथापि, जेव्हा आपल्याला विद्यमान जावास्क्रिप्ट लायब्ररींचे विस्तृत इकोसिस्टम वापरायचे असते तेव्हा एक मोठी समस्या उद्भवते—ज्यापैकी बहुतेक टाइपस्क्रिप्टमध्ये लिहिलेले नव्हते. आमचा काटेकोरपणे टाइप केलेला टाइपस्क्रिप्ट कोड अनटाइप्ड जावास्क्रिप्ट लायब्ररीमधील आकार, कार्ये आणि व्हेरिएबल्स कसे समजून घेतो?
याचे उत्तर टाइपस्क्रिप्ट डिक्लेरेशन फाइल्समध्ये आहे. या फाइल्स, ज्यांच्या .d.ts एक्सटेंशनवरून ओळखल्या जातात, त्या टाइपस्क्रिप्ट आणि जावास्क्रिप्ट जगांमधील आवश्यक पूल आहेत. त्या थर्ड-पार्टी लायब्ररीच्या कोणत्याही प्रत्यक्ष अंमलबजावणीशिवाय त्याच्या प्रकारांचे वर्णन करून ब्लूप्रिंट किंवा API कराराचे काम करतात. या सर्वसमावेशक मार्गदर्शकामध्ये, आपल्याला आपल्या टाइपस्क्रिप्ट प्रोजेक्टमध्ये कोणत्याही जावास्क्रिप्ट लायब्ररीसाठी टाइप डेफिनिशन्स आत्मविश्वासाने व्यवस्थापित करण्यासाठी आवश्यक असलेली प्रत्येक गोष्ट शोधू.
टाइपस्क्रिप्ट डिक्लेरेशन फाइल्स म्हणजे नक्की काय?
कल्पना करा की आपण एका कंत्राटदाराला कामावर घेतले आहे जो फक्त एक वेगळी भाषा बोलतो. त्यांच्याबरोबर प्रभावीपणे काम करण्यासाठी, आपल्याला एक अनुवादक किंवा आपल्या दोघांनाही समजेल अशा भाषेत सूचनांचा तपशीलवार संच आवश्यक असेल. डिक्लेरेशन फाइल टाइपस्क्रिप्ट कंपाइलरसाठी (कंत्राटदार) हेच काम करते.
.d.ts फाइलमध्ये केवळ प्रकाराची माहिती असते. त्यात खालील गोष्टींचा समावेश आहे:
- कार्ये आणि पद्धतींसाठी स्वाक्षऱ्या (पॅरामीटर प्रकार, रिटर्न प्रकार).
- व्हेरिएबल्स आणि त्यांचे प्रकारांसाठी व्याख्या.
- गुंतागुंतीच्या ऑब्जेक्ट्ससाठी इंटरफेस आणि टाइप एलियासेस.
- वर्ग व्याख्या, त्यांच्या गुणधर्म आणि पद्धतींसह.
- नेमस्पेस आणि मॉड्यूल स्ट्रक्चर्स.
महत्वाचे म्हणजे, या फाइल्समध्ये कोणताही एक्झिक्युटेबल कोड नसतो. त्या केवळ स्टॅटिक विश्लेषणासाठी आहेत. जेव्हा आपण लोडाशसारखी जावास्क्रिप्ट लायब्ररी आपल्या टाइपस्क्रिप्ट प्रोजेक्टमध्ये इम्पोर्ट करता, तेव्हा कंपाइलर संबंधित डिक्लेरेशन फाइल शोधतो. जर ती सापडली, तर तो आपला कोड व्हॅलिडेट करू शकतो, इंटेलिजेंट ऑटो कंप्लीशन देऊ शकतो आणि आपण लायब्ररी योग्यरित्या वापरत आहात याची खात्री करू शकतो. जर ती सापडली नाही, तर तो खालील प्रमाणे एरर देईल: Could not find a declaration file for module 'lodash'.
व्यावसायिक विकासासाठी डिक्लेरेशन फाइल्स का आवश्यक आहेत
टाइपस्क्रिप्ट प्रोजेक्टमध्ये योग्य टाइप डेफिनिशन्सशिवाय जावास्क्रिप्ट लायब्ररी वापरणे हे टाइपस्क्रिप्ट वापरण्याचे मूळ कारण कमकुवत करते. लोकप्रिय युटिलिटी लायब्ररी, लोडाश वापरून एक साधे उदाहरण विचारात घेऊ.
टाइप डेफिनिशन्सशिवाय जग
डिक्लेरेशन फाइलशिवाय, टाइपस्क्रिप्टला lodash काय आहे किंवा त्यात काय आहे याची कल्पना नाही. कोड कंपाइल करण्यासाठी, आपण हा त्वरित उपाय वापरण्याचा मोह होऊ शकतो:
const _: any = require('lodash');
const users = [{ 'user': 'barney' }, { 'user': 'fred' }];
// Autocomplete? No help here.
// Type checking? No. Is 'username' the correct property?
// The compiler allows this, but it might fail at runtime.
_.find(users, { username: 'fred' });
या प्रकरणात, _ व्हेरिएबल any प्रकारचा आहे. हे प्रभावीपणे टाइपस्क्रिप्टला सांगते, "या व्हेरिएबलशी संबंधित कोणतीही गोष्ट तपासू नका." आपण सर्व फायदे गमावता: कोणतेही ऑटो कंप्लीशन नाही, आर्ग्युमेंट्सवर कोणतेही टाइप चेकिंग नाही आणि रिटर्न प्रकाराबद्दल कोणतीही निश्चितता नाही. हे रनटाइम एररसाठी breeding ground आहे.
टाइप डेफिनिशन्स असलेले जग
आता, आवश्यक डिक्लेरेशन फाइल दिल्यावर काय होते ते पाहूया. प्रकार स्थापित केल्यानंतर (जे आपण पुढे पाहू), अनुभव बदलला जातो:
import _ from 'lodash';
interface User {
user: string;
active?: boolean;
}
const users: User[] = [{ 'user': 'barney' }, { 'user': 'fred' }];
// 1. Editor provides autocompletion for 'find' and other lodash functions.
// 2. Hovering over 'find' shows its full signature and documentation.
// 3. TypeScript sees that `users` is an array of `User` objects.
// 4. TypeScript knows the predicate for `find` on `User[]` should involve `user` or `active`.
// CORRECT: TypeScript is happy.
const fred = _.find(users, { user: 'fred' });
// ERROR: TypeScript catches the mistake!
// Property 'username' does not exist on type 'User'.
const betty = _.find(users, { username: 'betty' });
फरक जमीन-आस्मानाचा आहे. आम्हाला पूर्ण टाइप सेफ्टी, टूलिंगद्वारे उत्कृष्ट डेव्हलपर अनुभव आणि संभाव्य बगमध्ये नाट्यमय घट मिळते. टाइपस्क्रिप्टबरोबर काम करण्यासाठी हे व्यावसायिक मानक आहे.
टाइप डेफिनिशन्स शोधण्याची श्रेणीबद्धता
तर, आपल्या आवडत्या लायब्ररीसाठी या जादूई .d.ts फाइल्स कशा मिळवायच्या? येथे एक प्रस्थापित प्रक्रिया आहे जी बहुतेक परिस्थिती कव्हर करते.
पायरी 1: लायब्ररी स्वतःचे प्रकार बंडल करते का ते तपासा
सर्वोत्तम परिस्थिती म्हणजे जेव्हा लायब्ररी टाइपस्क्रिप्टमध्ये लिहिली जाते किंवा तिचे मेंटेनर्स त्याच पॅकेजमध्ये अधिकृत डिक्लेरेशन फाइल्स पुरवतात. हे आधुनिक, चांगल्या प्रकारे मेंटेन केलेल्या प्रोजेक्टसाठी अधिकाधिक सामान्य होत आहे.
कसे तपासायचे:
- नेहमीप्रमाणे लायब्ररी स्थापित करा:
npm install axios node_modules/axiosमधील लायब्ररीच्या फोल्डरमध्ये पहा. तुम्हाला.d.tsफाइल्स दिसतात का?- लायब्ररीच्या
package.jsonफाइलमध्ये"types"किंवा"typings"फील्ड तपासा. हे फील्ड थेट मुख्य डिक्लेरेशन फाइलकडे निर्देश करते. उदाहरणार्थ, ऍक्सिओसच्याpackage.jsonमध्ये खालील समाविष्ट आहे:"types": "index.d.ts".
जर या अटी पूर्ण झाल्या, तर तुमचे काम झाले! टाइपस्क्रिप्ट आपोआप हे बंडल केलेले प्रकार शोधेल आणि वापरेल. कोणतीही पुढील कारवाई आवश्यक नाही.
पायरी 2: डेफिनेटली टाइप प्रोजेक्ट (@types)
हजारो जावास्क्रिप्ट लायब्ररींसाठी जे स्वतःचे प्रकार बंडल करत नाहीत, जागतिक टाइपस्क्रिप्ट समुदायाने एक अविश्वसनीय संसाधन तयार केले आहे: डेफिनेटली टाइप.
डेफिनेटली टाइप हे GitHub वरील एक सेंट्रलाईज्ड, समुदाय-व्यवस्थापित रेपॉजिटरी आहे जे मोठ्या संख्येने जावास्क्रिप्ट पॅकेजेससाठी उच्च-गुणवत्तेच्या डिक्लेरेशन फाइल्स होस्ट करते. या डेफिनिशन्स @types स्कोप अंतर्गत npm रजिस्ट्रीमध्ये प्रकाशित केल्या जातात.
ते कसे वापरावे:
जर lodash सारखी लायब्ररी स्वतःचे प्रकार बंडल करत नसेल, तर आपण त्याचे संबंधित @types पॅकेज डेव्हलपमेंट डिपेंडेंसी म्हणून स्थापित करा:
npm install --save-dev @types/lodash
नावाConvention सोपे आणि अंदाजे आहे: package-name नावाच्या पॅकेजसाठी, त्याचे प्रकार जवळजवळ नेहमीच @types/package-name वर असतील. आपण npm वेबसाइटवर किंवा थेट डेफिनेटली टाइप रेपॉजिटरीवर उपलब्ध प्रकार शोधू शकता.
--save-dev का? डिक्लेरेशन फाइल्स केवळ डेव्हलपमेंट आणि कंपाइलेशन दरम्यान आवश्यक असतात. त्यामध्ये कोणताही रनटाइम कोड नसतो, त्यामुळे त्या आपल्या अंतिम प्रोडक्शन बंडलमध्ये समाविष्ट नसाव्यात. त्यांना devDependency म्हणून स्थापित केल्याने हे विभाजन सुनिश्चित होते.
पायरी 3: जेव्हा कोणतेही प्रकार अस्तित्वात नसतात - आपले स्वतःचे लिहिणे
जर आपण एखादी जुनी, विशिष्ट किंवा अंतर्गत खाजगी लायब्ररी वापरत असाल जी प्रकार बंडल करत नाही आणि डेफिनेटली टाइपवर नाही? या प्रकरणात, आपल्याला आपली बाही गुंडाळावी लागेल आणि स्वतःची डिक्लेरेशन फाइल तयार करावी लागेल. हे थोडे कठीण वाटू शकते, परंतु आपण साध्या पद्धतीने सुरुवात करू शकता आणि आवश्यकतेनुसार अधिक तपशील जोडू शकता.
क्विक फिक्स: शॉर्टहँड एम्बियंट मॉड्यूल डिक्लेरेशन
कधीकधी, आपल्याला योग्य टाइपिंग धोरण शोधताना त्रुटीशिवाय आपला प्रोजेक्ट कंपाइल करणे आवश्यक असते. आपण आपल्या प्रोजेक्टमध्ये एक फाइल तयार करू शकता (उदा., declarations.d.ts किंवा types/global.d.ts) आणि एक शॉर्टहँड डिक्लेरेशन जोडू शकता:
// in a .d.ts file
declare module 'some-untyped-library';
हे टाइपस्क्रिप्टला सांगते, "माझ्यावर विश्वास ठेवा, 'some-untyped-library' नावाचे एक मॉड्यूल अस्तित्वात आहे. त्यातून इम्पोर्ट केलेल्या प्रत्येक गोष्टीला any प्रकार म्हणून वागवा." हे कंपाइलर त्रुटी शांत करते, परंतु आम्ही चर्चा केल्याप्रमाणे, ते त्या लायब्ररीसाठी सर्व टाइप सेफ्टीचा त्याग करते. हा एक तात्पुरता पॅच आहे, दीर्घकालीन उपाय नाही.
एक मूलभूत कस्टम डिक्लेरेशन फाइल तयार करणे
एक चांगला दृष्टीकोन म्हणजे आपण वापरत असलेल्या लायब्ररीच्या भागांसाठी प्रकार परिभाषित करणे सुरू करणे. समजा आपल्याकडे `string-utils` नावाची एक साधी लायब्ररी आहे जी एक फंक्शन एक्सपोर्ट करते.
// In node_modules/string-utils/index.js
module.exports.capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
आम्ही आपल्या प्रोजेक्टच्या रूटमधील एका समर्पित `types` डायरेक्टरीमध्ये string-utils.d.ts फाइल तयार करू शकतो.
// In my-project/types/string-utils.d.ts
declare module 'string-utils' {
export function capitalize(str: string): string;
// You could add other function definitions here as you use them
// export function slugify(str: string): string;
}
आता, आपल्याला टाइपस्क्रिप्टला आपले कस्टम टाइप डेफिनिशन्स कोठे शोधायचे ते सांगावे लागेल. आम्ही हे tsconfig.json मध्ये करतो:
{
"compilerOptions": {
// ... other options
"baseUrl": ".",
"paths": {
"*": ["types/*"]
}
}
}
या सेटअपसह, जेव्हा आपण import { capitalize } from 'string-utils' करता, तेव्हा टाइपस्क्रिप्टला आपली कस्टम डिक्लेरेशन फाइल सापडेल आणि आपण परिभाषित केलेली टाइप सेफ्टी प्रदान करेल. आपण लायब्ररीची अधिक वैशिष्ट्ये वापरता तसतसे आपण हळूहळू ही फाइल तयार करू शकता.
सखोल अभ्यास: डिक्लेरेशन फाइल्स ऑथर करणे
डिक्लेरेशन फाइल्स लिहिताना किंवा वाचताना आपल्याला येणाऱ्या काही अधिक प्रगत संकल्पनांचे अन्वेषण करूया.
वेगवेगळ्या प्रकारचे एक्सपोर्ट्स घोषित करणे
जावास्क्रिप्ट मॉड्यूल्स विविध प्रकारे गोष्टी एक्सपोर्ट करू शकतात. आपल्या डिक्लेरेशन फाइलने लायब्ररीच्या एक्सपोर्ट स्ट्रक्चरशी जुळले पाहिजे.
- नेमड एक्सपोर्ट्स: हे सर्वात सामान्य आहे. आपण ते वर `export function capitalize(...)` मध्ये पाहिले. आपण कॉन्स्टंट्स, इंटरफेस आणि क्लासेस देखील एक्सपोर्ट करू शकता.
- डिफॉल्ट एक्सपोर्ट: लायब्ररींसाठी जे `export default` वापरतात.
- UMD ग्लोबल्स: जुन्या लायब्ररींसाठी जे
<script>टॅगद्वारे ब्राउझरमध्ये कार्य करण्यासाठी डिझाइन केलेले आहेत, ते बहुतेकदा स्वतःला जागतिक `window` ऑब्जेक्टशी जोडतात. आपण हे जागतिक व्हेरिएबल्स घोषित करू शकता. - `export =` आणि `import = require()`: हे वाक्यरचना जुन्या CommonJS मॉड्यूल्ससाठी आहे जे `module.exports = ...` वापरतात. उदाहरणार्थ, जर लायब्ररी `module.exports = myClass;` करत असेल.
declare module 'my-lib' {
export const version: string;
export interface Options { retries: number; }
export function doSomething(options: Options): Promise
declare module 'my-default-lib' {
// For a function default export
export default function myCoolFunction(): void;
// For an object default export
// const myLib = { name: 'lib', version: '1.0' };
// export default myLib;
}
// Declares a global variable '$' of a certain type
declare var $: JQueryStatic;
// in my-class.d.ts
declare class MyClass { constructor(name: string); }
export = MyClass;
// in your app.ts
import MyClass = require('my-class');
const instance = new MyClass('test');
आधुनिक ES मॉड्यूल्समध्ये हे कमी सामान्य असले तरी, बर्याच जुन्या परंतु अजूनही मोठ्या प्रमाणावर वापरल्या जाणार्या Node.js पॅकेजेसशी सुसंगततेसाठी हे गंभीर आहे.
मॉड्यूल ऑगमेंटेशन: विद्यमान प्रकार वाढवणे
सर्वात शक्तिशाली वैशिष्ट्यांपैकी एक म्हणजे मॉड्यूल ऑगमेंटेशन (ज्याला डिक्लेरेशन मर्जिंग देखील म्हणतात). हे आपल्याला दुसर्या पॅकेजच्या डिक्लेरेशन फाइलमध्ये परिभाषित केलेल्या विद्यमान इंटरफेसमध्ये गुणधर्म जोडण्याची परवानगी देते. हे एक्सप्रेस किंवा फास्टिफाय सारख्या प्लगइन आर्किटेक्चर असलेल्या लायब्ररींसाठी अत्यंत उपयुक्त आहे.
कल्पना करा की आपण एक्सप्रेसमध्ये एक मिडलवेअर वापरत आहात जो `Request` ऑब्जेक्टमध्ये `user` गुणधर्म जोडतो. ऑगमेंटेशनशिवाय, टाइपस्क्रिप्ट तक्रार करेल की `Request` वर `user` अस्तित्वात नाही.
आपण टाइपस्क्रिप्टला या नवीन गुणधर्माबद्दल कसे सांगू शकता ते येथे आहे:
// in your types/express.d.ts file
// We must import the original type to augment it
import { UserProfile } from './auth'; // Assuming you have a UserProfile type
// Tell TypeScript we're augmenting the 'express-serve-static-core' module
declare module 'express-serve-static-core' {
// Target the 'Request' interface inside that module
interface Request {
// Add our custom property
user?: UserProfile;
}
}
आता, आपल्या संपूर्ण ऍप्लिकेशनमध्ये, एक्सप्रेस `Request` ऑब्जेक्ट वैकल्पिक `user` गुणधर्मासह योग्यरित्या टाइप केला जाईल आणि आपल्याला पूर्ण टाइप सेफ्टी आणि ऑटो कंप्लीशन मिळेल.
ट्रिपल-स्लॅश डायरेक्टिव्ह्ज
आपण कधीकधी .d.ts फाइल्सच्या शीर्षस्थानी तीन स्लॅश (///) ने सुरू होणाऱ्या कमेंट्स पाहू शकता. हे ट्रिपल-स्लॅश डायरेक्टिव्ह्ज आहेत, जे कंपाइलर सूचना म्हणून कार्य करतात.
/// <reference types="..." />: हे सर्वात सामान्य आहे. हे स्पष्टपणे दुसर्या पॅकेजच्या टाइप डेफिनिशन्सला अवलंबित्व म्हणून समाविष्ट करते. उदाहरणार्थ, वेबड्रायव्हरिओ प्लगइनसाठी प्रकारांमध्ये/// <reference types="webdriverio" />समाविष्ट असू शकते कारण त्याचे स्वतःचे प्रकार कोअर वेबड्रायव्हरिओ प्रकारांवर अवलंबून असतात./// <reference path="..." />: हे एकाच प्रोजेक्टमधील दुसर्या फाइलवरील अवलंबित्व घोषित करण्यासाठी वापरले जाते. ही एक जुनी वाक्यरचना आहे, जी मोठ्या प्रमाणात ES मॉड्यूल इम्पोर्ट्सद्वारे superseded आहे.
डिक्लेरेशन फाइल्स व्यवस्थापित करण्यासाठी सर्वोत्तम पद्धती
- बंडल केलेले प्रकार पसंत करा: लायब्ररी निवडताना, टाइपस्क्रिप्टमध्ये लिहिलेल्या किंवा स्वतःचे अधिकृत टाइप डेफिनिशन्स बंडल केलेल्या लायब्ररींना प्राधान्य द्या. हे टाइपस्क्रिप्ट इकोसिस्टमसाठी एक वचनबद्धता दर्शवते.
@typesdevDependenciesमध्ये ठेवा:@typesपॅकेजेस नेहमी--save-devकिंवा-Dसह स्थापित करा. ते आपल्या प्रोडक्शन कोडसाठी आवश्यक नाहीत.- व्हर्जन्स संरेखित करा: त्रुटींचा एक सामान्य स्रोत म्हणजे लायब्ररी व्हर्जन आणि त्याचे
@typesव्हर्जनमधील विसंगती. लायब्ररीमधील मोठे व्हर्जन बदल (उदा. v2 ते v3 पर्यंत) तिच्या API मध्ये ब्रेकिंग बदल होण्याची शक्यता आहे, जे@typesपॅकेजमध्ये प्रतिबिंबित केले पाहिजे. त्यांना समक्रमित ठेवण्याचा प्रयत्न करा. - नियंत्रणासाठी
tsconfig.jsonवापरा: आपल्याtsconfig.jsonमधीलtypeRootsआणिtypesकंपाइलर पर्याय आपल्याला टाइपस्क्रिप्ट डिक्लेरेशन फाइल्स कोठे शोधते यावर बारीक नियंत्रण देऊ शकतात.typeRootsकंपाइलरला कोणते फोल्डर तपासायचे सांगतात (डीफॉल्टनुसार, ते./node_modules/@typesआहे), आणिtypesआपल्याला कोणत्या टाइप पॅकेजेस समाविष्ट करायच्या आहेत ते स्पष्टपणे सूचीबद्ध करण्यास अनुमती देते. - परत योगदान द्या: जर आपण लायब्ररीसाठी एक सर्वसमावेशक डिक्लेरेशन फाइल लिहित असाल ज्यामध्ये ती नसेल, तर डेफिनेटली टाइप प्रोजेक्टमध्ये योगदान देण्याचा विचार करा. जागतिक डेव्हलपर समुदायाला परत देण्याचा आणि हजारो इतरांना मदत करण्याचा हा एक अद्भुत मार्ग आहे.
निष्कर्ष: टाइप सेफ्टीचे अनसंग हिरो
टाइपस्क्रिप्ट डिक्लेरेशन फाइल्स हे अनसंग हिरो आहेत जे जावास्क्रिप्टच्या डायनॅमिक, विस्तृत जगाला एका मजबूत, टाइप-सेफ डेव्हलपमेंट वातावरणात अखंडपणे एकत्रित करणे शक्य करतात. ते गंभीर दुवा आहेत जे आपली साधने सक्षम करतात, असंख्य बग प्रतिबंधित करतात आणि आपले कोडबेस अधिक लवचिक आणि स्व-दस्तऐवजीकरण करतात.
.d.ts फाइल्स शोधणे, वापरणे आणि तयार करणे कसे समजून घेऊन, आपण फक्त कंपाइलर त्रुटी निश्चित करत नाही आहात—आपण आपल्या संपूर्ण डेव्हलपमेंट वर्कफ्लोला उन्नत करत आहात. आपण टाइपस्क्रिप्ट आणि जावास्क्रिप्ट लायब्ररींच्या समृद्ध इकोसिस्टम या दोहोंची पूर्ण क्षमता अनलॉक करत आहात, ज्यामुळे एक शक्तिशाली समन्वय तयार होतो ज्यामुळे जागतिक प्रेक्षकांसाठी चांगले, अधिक विश्वसनीय सॉफ्टवेअर तयार होते.