समस्या यह है कि जावास्क्रिप्ट निर्मित बिल्ट-इन क्लास Error, निर्माण की जाने वाली वस्तु को स्विच करके प्रोटोटाइप श्रृंखला को तोड़ती है (यानी this) जब आप कॉल करते हैं तो एक नई, अलग वस्तु, superऔर उस नई वस्तु में अपेक्षित प्रोटोटाइप श्रृंखला नहीं होती है, अर्थात यह एक उदाहरण है। की Errorकी नहीं CustomError।
इस समस्या को 'new.target' का उपयोग करके सुरुचिपूर्ण ढंग से हल किया जा सकता है, जो कि टाइपस्क्रिप्ट 2.2 के बाद से समर्थित है, यहां देखें: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html
class CustomError extends Error {
constructor(message?: string) {
super(message);
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); }
else { this.__proto__ = actualProto; }
}
}
उपयोग करने new.targetका यह फायदा है कि आपको प्रोटोटाइप को हार्डकोड करने की आवश्यकता नहीं है, जैसे कि यहां कुछ अन्य उत्तर प्रस्तावित हैं। इससे फिर से यह फायदा होता है कि इनसे विरासत में मिली कक्षाएं CustomErrorअपने आप सही प्रोटोटाइप श्रृंखला भी प्राप्त कर लेंगी।
यदि आप प्रोटोटाइप (उदाहरण के लिए Object.setPrototype(this, CustomError.prototype)) को हार्डकोड करते हैं , तो CustomErrorस्वयं एक काम करने वाली प्रोटोटाइप श्रृंखला होगी, लेकिन इससे प्राप्त होने वाली कोई भी कक्षाएं CustomErrorटूट जाएंगी, उदाहरण के लिए अपेक्षा के अनुरूप class VeryCustomError < CustomErrorनहीं होगा instanceof VeryCustomError, लेकिन केवल instanceof CustomError।
इसे भी देखें: https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-27858500200