उन विशेषज्ञ पैटर्नों को लागू करें जो एक वास्तविक कोडबेस को सुरक्षित करते हैं: सिमुलेटेड नामिकता, बिना वाइडनिंग के वैलिडेशन, और ऐम्बिएंट घोषणाएं।
इस पाठ को Kodokon में खोलेंTypeScript की टाइपिंग संरचनात्मक (structural) है: एक ही आकार वाले दो टाइप्स आपस में विनिमेय होते हैं, इसलिए एक user-id string किसी भी अन्य string से अप्रभेद्य है। ब्रांडिंग आधार टाइप को एक फ़ैंटम प्रॉपर्टी के साथ इंटरसेक्ट करके नामिक टाइपिंग का अनुकरण करती है जिसकी की एक unique symbol होती है: कोई भी वास्तविक मान इसे कभी नहीं रखता, लेकिन अब कंपाइलर प्रत्येक ब्रांड को अलग पहचान लेता है।
declare const brand: unique symbol;
type Brand<T, Name extends string> =
T & { readonly [brand]: Name };
type UserId = Brand<string, "UserId">;
type OrderId = Brand<string, "OrderId">;
function asUserId(raw: string): UserId {
return raw as UserId;
}
declare function loadUser(id: UserId): void;
loadUser(asUserId("u_42")); // OK
// loadUser("u_42"); // error: bare string rejectedsatisfies ऑपरेटर (TypeScript 4.9) एक सटीक कमी को भरता है। एक : T एनोटेशन वेरिएबल के टाइप को T तक चौड़ा (widen) कर देता है और अनुमानित लिटरल्स खो देता है; एक as T जांचों के एक हिस्से को अक्षम कर देता है। satisfies T सत्यापित करता है कि एक्सप्रेशन T के अनुरूप है बिना अनुमानित टाइप को छुए, जो यथासंभव सटीक बना रहता है। यह कॉन्फ़िगरेशन ऑब्जेक्ट्स के लिए आदर्श उपकरण है: पूर्ण वैलिडेशन, सटीकता बरकरार।
type RouteDef = { path: string; auth?: boolean };
const routes = {
home: { path: "/" },
admin: { path: "/admin", auth: true },
} satisfies Record<string, RouteDef>;
routes.admin.auth;
// literal type true: the inferred precision is
// preserved, and an unknown key would be rejectedएक .d.ts फ़ाइल में केवल ऐम्बिएंट घोषणाएं (ambient declarations) होती हैं: यह उन मानों का वर्णन करती है जो रनटाइम पर मौजूद रहेंगे, बिना JavaScript की एक भी पंक्ति उत्सर्जित किए। किसी मॉड्यूल से ग्लोबल स्कोप का विस्तार करने के लिए, declare global ब्लॉक अनिवार्य है - और विनिर्देश इसे केवल उसी फ़ाइल में अनुमति देता है जो वास्तव में एक मॉड्यूल हो, इसलिए फ़ाइल के शीर्ष पर export {} मुहावरा।
export {};
declare global {
interface Window {
analytics: { track(event: string): void };
}
}बिना प्रकाशित टाइप्स वाली किसी JavaScript डिपेंडेंसी के लिए, declare module एक ऐम्बिएंट मॉड्यूल बनाता है: कंपाइलर पैकेज के प्रत्येक इंपोर्ट के लिए आपकी घोषणा का उपयोग करेगा। skipLibCheck के दायरे से सावधान रहें: सक्षम होने पर, यह सभी .d.ts फ़ाइलों से त्रुटियों को अनदेखा कर देता है, जिसमें आपकी भी शामिल हैं; इसलिए अपनी घोषणाओं को साधारण .ts फ़ाइलों में रखे गए टाइप टेस्ट के माध्यम से सत्यापित करें।
declare module "legacy-lib" {
export interface InitOptions {
debug?: boolean;
}
export function init(options?: InitOptions): void;
}satisfies T और एक : T एनोटेशन के बीच क्या अंतर है?Brand<string, ...> के साथ बनाया गया एक ब्रांडेड मान क्या रखता है?declare global का उपयोग करने वाली .d.ts फ़ाइल के शीर्ष पर export {} क्यों जोड़ें?