Typescript 循环遍历泛型中的属性

Typescript 循环遍历泛型中的属性,typescript,typescript-generics,Typescript,Typescript Generics,如何找到泛型包含的属性并循环它们 class Foo { bar: number; thing: string; static jsonToFoo(json: any): Foo { return jsonToWidget<Foo>(json); } } function jsonToWidget<T>(json: any): T { const values: any[] = []; for (const key in T) { /

如何找到泛型包含的属性并循环它们

class Foo {
  bar: number;
  thing: string;

  static jsonToFoo(json: any): Foo {
    return jsonToWidget<Foo>(json);
  }
}

function jsonToWidget<T>(json: any): T {
  const values: any[] = [];

  for (const key in T) { //  <---- this is invalid
    if (json[key]) {
      values.push(json[key]);
    }
  }

  return new (<any> this.constructor)(...values) as T;
}

const newFoo: Foo = jsonToFoo({bar: 1, thing: 'foobar'});
class-Foo{
条:数字;
东西:绳子;
静态jsonToFoo(json:any):Foo{
返回jsonToWidget(json);
}
}
函数jsonToWidget(json:any):T{
常量值:任意[]=[];

对于(T中的const key){/,我建议在本例中为此维护您自己的const对象,使用默认值/null值初始化。这不是TypeScript问题,尽管TypeScript在编译器中提供了一个很好的解决方案

在一天结束时,要在运行时循环对象键,您需要在运行时初始化一个对象(也许typescript会将其放入您的输出代码中)。您可以花时间尝试找出typescript是否有一些很好的方法为您做到这一点,或者您可以继续做您知道需要做的事情


为此,我可能会在自己的作用域中维护一个const对象列表,并有一个按名称获取对象的函数。在通用函数中,您需要在运行时知道正在处理的对象(传递键或其他)-然后调用函数使对象循环。或者类似的…

给定TS从运行时消失,我认为这是不可能的。给定有多少
any
as
,您不会从“键入”中受益不管怎样。是的,一开始我理解错了,但现在我看到了问题所在——肯定没有看到你将如何得到“T”在运行时,没有办法。不过我相信有一种奇特的TypeScript方法可以做到这一点,你只需要知道,在运行时,他们将做一些必要的工作,就像使用TypeScript枚举一样,在运行时没有这样的事情。在一天结束时,我想你将需要一个用循环所需的键初始化的const对象然后我将使用for(var key of Object.keys(obj))循环遍历它们。实际上,仔细考虑一下-如果T是一个类,我没有弄糟,只是尝试创建新的T(),如果默认构造函数可以为您提供一个要循环的对象…可能必须在构造函数中实现默认值,但不确定。。。