2016-01-27 30 views
2

在TypeScript中有一个类(例如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' }),还没有尝试过,但它会使用JavaScript原型属性。使用TypeScript内部机制会很好。

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

+0

你为什么不重复从? '(var property in from){ to [property] = from [property]; }' –

+0

'from'('any')可能有更多的属性,不应该在'to'中设置 –

回答

0

初始化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

可以适用于每个可复制性的定制的装饰的:

@Copiable 
    lang:string; 

然后里面@copiable装饰器函数,你将存储目标属性名称在一些静态收集器ction。

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

然后在mergeTo方法后,你就可以遍历存储在CopiableProperties所有复印的属性名称。

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

+0

有趣的方法,但正如你所说,这有点矫枉过正。而另一个问题可能会出现:在哪里存储这个集合? –

+1

为了我的目的,我有一个特殊的公共助手静态类,专门用于包含这些'元'信息。 – Amid

+0

我会喜欢使用装饰器(!)的想法,但它无助于使代码更具可读性或可维护性。由于这些原因,我宁愿选择我的答案。带给我一个论点,说明你的解决方案比我的解决方案更好,我将改变你接受的答案。 ;) –