2016-01-27 31 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

我會喜歡使用裝飾器(!)的想法,但它無助於使代碼更具可讀性或可維護性。由於這些原因,我寧願選擇我的答案。帶給我一個論點,說明你的解決方案比我的解決方案更好,我將改變你接受的答案。 ;) –