在类类型属性中循环的Typescript

mej*_*eji 19 reflection typescript

如何在TypeScript中循环遍历类的属性?以下面的类为例:

export class Task implements Itask {
  public Id: number = 0;
  public Name: string;
  public Description: string;
  public Completed: boolean = false;
  public TaskType: TaskType;
}
Run Code Online (Sandbox Code Playgroud)

我想检索属性,因此:["Id","Name","Description","Completed","TaskType"]

试着

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;
};  
Run Code Online (Sandbox Code Playgroud)

不幸的是没有成功,我知道使用"TodoApp.Task.arguments"是不正确的.但是,有人能告诉我正确的方法吗?

lor*_*isi 11

让我们考虑所有"未定义"的属性,即在typescript类中定义的所有属性(我写的"未定义",而不是undefined由于下面将要明确的原因)

class A { 

   prop1: string
   prop2: number

} 
Run Code Online (Sandbox Code Playgroud)

不会受到任何的枚举Object.keysthis.hasOwnProperty(k)因为JavaScript有没有这些属性的知识AUTOGEN.在创建typescript类时,只有一个选项,即将所有属性初始化为默认值,如

class A { 

   prop1: string
   prop2: number
   prop3: B

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

} 
Run Code Online (Sandbox Code Playgroud)

此时,您将从A字典中获取实例的所有属性,例如此映射迭代

var a = new A();
for (var i in properties) {
   if (a.hasOwnProperty(i)) {
      a[i]=properties[i];
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢默认值解决方案,您仍然可以使用magic undefinedjavascript关键字执行此操作,以便您执行以下操作:

class A { 

   prop1: string = undefined
   prop2: number = undefined

} 
Run Code Online (Sandbox Code Playgroud)

此时,javascript对应项将包含模型中的所有属性,您将Object.keys(this)通过它们迭代它们或检查它们 this.hasOwnProperty

  • 基本的想法是正确的,但代码的错误不是吗?'properties'变量未定义.你需要这样的东西:`var a = new A(); for(var i in a){if(a.hasOwnProperty(i)){console.log(a [i]);}}` (6认同)
  • 我希望有一种方法可以让打字稿自动执行`undefined`初始化. (5认同)

Roy*_*y J 10

请参阅如何循环或枚举JavaScript对象?

在你的情况下,像:

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

  • 如果你有`class A {prop1:string}`并且你执行`a = new A()`而不指定`A.prop1`,那么对象实例`A`就不存在了,所以`hasOwnProperty`将会返回`false`.实际上,autogen javascript与类对象中的typescript属性定义无关. (6认同)
  • 该代码仅在创建新任务时才有效,即。var tsk = new TodoApp.Task(...); 我认为你可以像静态一样迭代类型结构? (2认同)
  • 不,您只能遍历对象.构造函数是一个函数(如果你看一下TypeScript生成的JavaScript,它就更清晰了). (2认同)