[javascript] ईएस 6 सिंटैक्स और बेबेल के साथ जावास्क्रिप्ट में विस्तार त्रुटि


Answers

इस उत्तर को जोड़कर, यह उत्तर और यह कोड , मैंने यह छोटा "सहायक" वर्ग बनाया है, जो ठीक काम करता प्रतीत होता है।

class ExtendableError extends Error {
  constructor(message) {
    super();
    this.message = message; 
    this.stack = (new Error()).stack;
    this.name = this.constructor.name;
  }
}    

// now I can extend

class MyError extends ExtendableError {
  constructor(m) {   
    super(m);
  }
}

var myerror = new MyError("ll");
console.log(myerror.message);
console.log(myerror instanceof Error);
console.log(myerror.name);
console.log(myerror.stack);

आरईपीएल में कोशिश करें

Question

मैं ईएस 6 और बेबेल के साथ त्रुटि बढ़ाने की कोशिश कर रहा हूं। यह काम नहीं कर रहा है।

class MyError extends Error {
  constructor(m) {
    super(m);
  }
}

var error = new Error("ll");
var myerror = new MyError("ll");
console.log(error.message) //shows up correctly
console.log(myerror.message) //shows empty string

त्रुटि ऑब्जेक्ट को सही संदेश सेट कभी नहीं मिलता है।

बेबेल आरईपीएल में आज़माएं

अब मैंने SO पर कुछ समाधान देखे हैं ( उदाहरण के लिए यहां ), लेकिन वे सभी बहुत un-ES6-y प्रतीत होते हैं। इसे एक अच्छा, ES6 तरीके से कैसे करें? (वह बेबेल में काम कर रहा है)




संपादित करें : टाइपस्क्रिप्ट 2.1 में परिवर्तन तोड़ना

त्रुटि, ऐरे और मानचित्र जैसे बिल्ट-इन्स को विस्तारित करना अब काम नहीं कर सकता है।

एक सिफारिश के रूप में, आप किसी भी सुपर (...) कॉल के तुरंत बाद प्रोटोटाइप मैन्युअल रूप से समायोजित कर सकते हैं।

संपादन ली बेन्सन मूल जवाब मेरे लिए थोड़ा सा काम करता है। यह उदाहरण के लिए ExtendableError क्लास के stack और अतिरिक्त तरीकों को भी जोड़ता है।

class ExtendableError extends Error {
   constructor(message) {
       super(message);
       Object.setPrototypeOf(this, ExtendableError.prototype);
       this.name = this.constructor.name;
   }

   dump() {
       return { message: this.message, stack: this.stack }
   }
 }    

class MyError extends ExtendableError {}

var myerror = new MyError("ll");
console.log(myerror.message);
console.log(myerror.dump());
console.log(myerror instanceof Error);
console.log(myerror.name);
console.log(myerror.stack);



@zangw उत्तर के अतिरिक्त, आप अपनी त्रुटियों को इस तरह परिभाषित कर सकते हैं:

'use strict';

class UserError extends Error {
  constructor(msg) {
    super(msg);
    this.name = this.constructor.name;
  }
}

// define errors
class MyError extends UserError {}
class MyOtherError extends UserError {}

console.log(new MyError instanceof Error); // true

throw new MyError('My message');

जो सही नाम, संदेश और स्टैकट्रैक फेंकता है:

MyError: My message
    at UserError (/Users/honzicek/Projects/api/temp.js:5:10)
    at MyError (/Users/honzicek/Projects/api/temp.js:10:1)
    at Object.<anonymous> (/Users/honzicek/Projects/api/temp.js:14:7)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:475:10)
    at startup (node.js:117:18)
    at node.js:951:3



जैसा कि @ सुकिमा का उल्लेख है, आप देशी जेएस का विस्तार नहीं कर सकते हैं। ओपी के सवाल का उत्तर नहीं दिया जा सकता है।

मेलबर्न 2 9 1 9 के जवाब के समान, मैंने कारखाने का इस्तेमाल किया, लेकिन ग्राहक त्रुटि प्रकारों के लिए एमडीएन की सिफारिश का पालन ​​किया।

function extendError(className){
  function CustomError(message){
    this.name = className;
    this.message = message;
    this.stack = new Error().stack; // Optional
  }
  CustomError.prototype = Object.create(Error.prototype);
  CustomError.prototype.constructor = CustomError;
  return CustomError;
}



मैं ES6 के साथ त्रुटि बढ़ाने की कोशिश कर रहा हूं

उस class MyError extends Error {…} वाक्यविन्यास सही है।

ध्यान दें कि ट्रांसपिलरों को अभी भी बिल्टिन ऑब्जेक्ट्स से विरासत में समस्याएं हैं। आपके मामले में,

var err = super(m);
Object.assign(this, err);

समस्या को ठीक करने लगता है।




Related