refleksi - Typescript mengulangi properti tipe kelas


Bagaimana seseorang dapat melakukan loop melalui properti dari sebuah kelas di TypeScript? Ambil contoh kelas berikut:

export class Task implements Itask {
  public Id: number = 0;
  public Name: string;
  public Description: string;
  public Completed: boolean = false;
  public TaskType: TaskType;
}

Saya ingin mengambil properti, yaitu: ["Id", "Name", "Description", "Completed", "TaskType"]

Mencoba

GetTaskHeaders = () => {
  const _self = this;
  const tHead = $('<thead />').append('<tr />');

  for (let i = 0; typeof TodoApp.Task.arguments; i++) {
    const th = $('<th />');
    th.append(TodoApp.Task.arguments[i]);
    tHead.append(th);
  }

  console.log(tHead);

  return tHead;
};  

Sayangnya tanpa berhasil, saya tahu menggunakan "TodoApp.Task.arguments" itu salah. Namun, bisakah seseorang menunjukkan cara yang benar, tolong?

Jawaban #1

Mari kita pertimbangkan bahwa semua properti "tidak didefinisikan", yaitu semua properti yang didefinisikan dalam kelas typescript seperti (saya menulis "tidak didefinisikan" dan bukan undefined dengan alasan yang akan jelas di bawah)

class A { 

   prop1: string
   prop2: number

} 

tidak akan dihitung oleh Object.keys atau this.hasOwnProperty(k) karena javascript autogen tidak memiliki pengetahuan tentang properti-properti tersebut. Anda hanya memiliki satu opsi, ketika Anda membuat kelas typescript Anda, yaitu menginisialisasi semua properti dengan nilai default seperti

class A { 

   prop1: string
   prop2: number
   prop3: B

   constructor() {
     this.prop1="";
     this.prop2=-1;
     this.prop3=null;
   }

} 

Pada titik ini Anda akan mendapatkan semua properti dari instance A seperti dalam iterasi pemetaan dari sebuah kamus

var a = new A();
for (var i in properties) {
   if (a.hasOwnProperty(i)) {
      a[i]=properties[i];
   }
}

Jika Anda tidak menyukai solusi nilai default, Anda masih bisa melakukan ini menggunakan kata kunci undefined JavaScript sehingga Anda melakukan:

class A { 

   prop1: string = undefined
   prop2: number = undefined

} 

Pada titik ini, rekanan javascript akan memiliki semua properti dalam model dan Anda akan mengiterasinya dengan Object.keys(this) atau memeriksanya melalui this.hasOwnProperty

Jawaban #2

Lihat Bagaimana saya melakukan loop atau mendata sebuah objek JavaScript?

Dalam kasus Anda, sesuatu seperti:

for (var i in TodoApp.Task) {
    if (TodoApp.Task.hasOwnProperty(i)) {
        var th = $('<th />').append(TodoApp.Task[i]);
        tHead.append(th);
    }
}

Artikel terkait