Saya ingin menulis dekorator log yang mencatat setiap kali fungsi (di mana dekorator menghiasi) dipanggil. Saya ingin mencatat kunci yang diterima dekorator sebagai parameter dan argumen yang digunakan fungsi tersebut.

Sejauh ini saya tahu cara menulis fungsi log sederhana yang mencatat argumen fungsi tetapi tidak dapat menerima parameter apa pun:

export function logger(
  target: Object,
  key: string,
  descriptor: PropertyDescriptor
) {
  const original = descriptor.value;
  descriptor.value = function() {
    const targetName = target.constructor.name;
    const args = JSON.stringify(arguments);
    console.log(`Calling ${targetName}.${key} with ${JSON.stringify(arguments)}`);
    const result = original.apply(this, arguments);
    return result;
  };
  return descriptor;
}

Saya juga tahu cara menulis dekorator yang menerima parameter:

log(logData: { value: string; target?: string }) {
    return function(
      target: Object,
      key: string,
      descriptor: PropertyDescriptor
    ) {
      console.log(`Key: ${logData.value}, Target: ${logData.target}`);

    };
  }

Jadi Anda mungkin dapat menebak bahwa saya kehilangan tautan di sini yang menulis dekorator log yang dapat menerima kunci sebagai parameter dan mencatat kunci ini dengan argumen yang dipanggil dengan fungsi yang didekorasi.

Saya memiliki contoh kerja dari 2 dekorator di sini: https://stackblitz.com/edit/angular- udi-decorators?file=src%2Fapp%2Flogger.ts

0
Udi Mazor 8 Maret 2020, 15:57

1 menjawab

Jawaban Terbaik

Jadi, saya menemukan jawabannya. Solusi saya berhasil. Saya ingin membuat dekorator untuk fungsi yang akan menyimpan data setiap kali fungsi dipanggil. Ini akan menyimpan kunci unik untuk setiap fungsi (akan diberikan dengan dekorator) dan juga akan mengirim parameter yang dikirim ke fungsi ini.

logWithData(logData: { value: string; target?: string }) {
    return function logger(
      target: Object,
      key: string,
      descriptor: PropertyDescriptor
    ) {
      const original = descriptor.value;
      descriptor.value = function() {
        const targetName = target.constructor.name;
        const args = JSON.stringify(arguments);
        console.log(`Key: ${logData.value}, Target: ${logData.target}, paramater: ${arguments[0]}`);
        const result = original.apply(this, arguments);
        return result;
      };
      return descriptor;
    };
  }

Saya juga meletakkan kode ini di stackblitz di sini

0
Udi Mazor 8 Maret 2020, 18:59