从TypeScript中的类读取属性名称?

时间:2016-01-27 13:41:41

标签: typescript angular typescript1.7

让一个类(例如WikipediaSearchResult)在TypeScript中具有一些属性,是否可以访问它们?也许这个问题有点天真,但我想知道我是否可以编写以下代码而没有重复的属性名称:

function mergeTo(from:any, to:any={}, properties:Array<string>=[]) {
  if (!!from) {
    for (var property of properties) {
      // no deep copy here ;-)
      to[property] = from[property];
    }
  }
}

class WikipediaSearchResult /* implements IWikipediaSearchResult */ {

  lang:string;
  summary:string;
  title:string;
  wikipediaUrl:string;

  constructor(obj?:any) {

    mergeTo(obj, this, [
      // --> How to avoid this list? <--
      'lang', 'summary', 'title', 'wikipediaUrl'
    ]);

  }

}

var result = new WikipediaSearchResult({
  title: 'Zürich', 
  wikipediaUrl: 'https://en.wikipedia.org/wiki/Z%C3%BCrich'
});

console.log(result);

当然有一些第三方库,例如Underscore.js,但它不同于例如_.clone(...)因为我只希望克隆特定属性并忽略obj from分别提供的所有其他属性_.create(WikipediaSearchResult.prototype, { title: 'Zürich' })

另一种方式可能是使用例如{{1}},尚未尝试过但它将使用JavaScript prototype属性。使用TypeScript内部机制会很棒。

我想出的一个想法是创建一个“虚拟”实例并阅读其密钥。我想知道是否有人想出更好的变体?

2 个答案:

答案 0 :(得分:1)

初始化类WikipediaSearchResult的属性允许使用this作为“模板”:

function mergeTo(from:any, to:any={}, properties:Array<string>=[]) {
  // same as in question
}

function mergeTo2(from:Object, to:Object):Object {
  // _.keys from underscore
  return mergeTo(from, to, _.keys(to));
}

class WikipediaSearchResult {

  lang:string = undefined;
  summary:string = undefined;
  title:string = undefined;
  wikipediaUrl:string = undefined;

  constructor(obj?:any) {
     util.mergeTo2(obj, this);
  }

}

var result = new WikipediaSearchResult({
  title: 'Zürich', 
  wikipediaUrl: 'https://en.wikipedia.org/wiki/Z%C3%BCrich'
});

console.log(result);

仍在寻找其他变种......

答案 1 :(得分:1)

您可以向每个可复制属性申请一个自定义装饰器:

  @Copiable
  lang:string;

然后在@copiable装饰器函数中,您将目标属性名称存储在某个静态集合中。

function Copiable(target: any, key: string) 
{
    CopiableProperties.push(key); 
}

然后在mergeTo方法中,您将能够遍历CopiableProperties中存储的所有可复制属性名称。

它可能有点矫枉过正,但它可以让你避免重复。 希望这会有所帮助。