Saya ingin dapat memiliki kelas, ChildError, yang memiliki beberapa definisi dasar atributnya per default: code dan message.

Namun, ketika saya benar-benar akan membuang kesalahan ini, ada kemungkinan saya mendefinisikan ulang nilai message. Jika demikian, saya ingin menggunakan definisi baru itu, bukan definisi yang ditentukan oleh ChildError.

Berikut ini contohnya:

class BaseError extends Error {

    public code: number = 0;

    constructor(arg: any = {}) {
        super(typeof arg === 'string' ? arg : arg.message);

        this.message = arg.message;
        this.code = arg.code; 
    }

    getMessage = (): string => {
        return this.message;
    }
}

class ChildError extends BaseError {
    code = 2;
    message = 'This is the child error message';
}

const cError = new ChildError({ message: 'hello' });
console.log('print : ', cError.getMessage());

Ini mencetak This is the child error message Namun, saya ingin hello dicetak

Ini adalah Tautan taman bermain

Dalam javascript yang ditranspilasikan, sepertinya ini tidak berfungsi karena argumen yang diteruskan ditangani sebelum kami menetapkan nilai default code dan message, sehingga mereka ditimpa. Bagaimana menghindari itu? Saya ingin argumen ditangani setelah nilai default!

Juga, console.log dalam konstruktor akan mencetak this.message sebagai hello seperti yang kita inginkan, ketika kita mencoba mengaksesnya dengan getMessage() ia mengembalikan This is the child error message .

Saya telah membaca utas SO ini, tetapi tampaknya tidak berlaku sejak propertinya tidak sama dengan nama kelas untuk saya ...

2
Mymozaaa 15 Agustus 2017, 22:12

2 jawaban

Jawaban Terbaik

Anda perlu memeriksa apakah properti pesan ada atau tidak coba cara ini

class ChildError extends BaseError {
    constructor(arg: any) {
        if (!arg.hasOwnProperty('message'))
            arg.message = "This is the child error message";
        super(arg);            
    }
}

Jika itu adalah niat Anda untuk tidak membiarkan nilai-nilai palsu alih-alih

if (!arg.hasOwnProperty('message'))

Gunakan secara sederhana

if (!arg.message)
0
Andro Font 15 Agustus 2017, 19:52

Cukup nyatakan konstruktor di ChildError yang menerima objek dengan pesan dan default ke message, seperti:

class BaseError extends Error {

    constructor(arg: any = {}) {
        super(typeof arg === 'string' ? arg : arg.message);

        this.message = arg.message;
    }

    getMessage = (): string => {
        return this.message;
    }
}

class ChildError extends BaseError {
  code = 2;

  constructor(arg) {
      super(arg || { message: 'This is the child error message' })
  }
}

const cError = new ChildError({ message: 'hello' });
console.log('print : ', cError.getMessage());
0
pedromss 15 Agustus 2017, 19:28