从 TypeScript 中的 class 中读取 属性 名称?
Reading property names from a class in TypeScript?
class(例如 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);
当然有一些第 3 方库,例如 Underscore.js,但它不同于例如_.clone(...)
因为我只想克隆特定属性并忽略 obj
可能分别提供的所有其他属性 from
。
另一种方法可能是使用例如_.create(WikipediaSearchResult.prototype, { title: 'Zürich' })
,还没有尝试过,但它会使用 JavaScript 原型 属性。使用 TypeScript 内部机制会很棒。
我想到的一个想法是创建一个 "dummy" 实例并读取它的密钥。我想知道是否有人想出了更好的变体?
初始化 class WikipediaSearchResult
的属性允许使用 this
作为 "template":
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);
仍在寻找其他变体...
您可以为每个可复制属性应用自定义装饰器:
@Copiable
lang:string;
然后在@copiable 装饰器函数中,您将在一些静态集合中存储目标 属性 名称。
function Copiable(target: any, key: string)
{
CopiableProperties.push(key);
}
稍后在 mergeTo 方法中,您将能够遍历存储在 CopiableProperties 中的所有可复制 属性 名称。
这可能有点矫枉过正,但它可以让您避免重复。
希望这有帮助。
class(例如 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);
当然有一些第 3 方库,例如 Underscore.js,但它不同于例如_.clone(...)
因为我只想克隆特定属性并忽略 obj
可能分别提供的所有其他属性 from
。
另一种方法可能是使用例如_.create(WikipediaSearchResult.prototype, { title: 'Zürich' })
,还没有尝试过,但它会使用 JavaScript 原型 属性。使用 TypeScript 内部机制会很棒。
我想到的一个想法是创建一个 "dummy" 实例并读取它的密钥。我想知道是否有人想出了更好的变体?
初始化 class WikipediaSearchResult
的属性允许使用 this
作为 "template":
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);
仍在寻找其他变体...
您可以为每个可复制属性应用自定义装饰器:
@Copiable
lang:string;
然后在@copiable 装饰器函数中,您将在一些静态集合中存储目标 属性 名称。
function Copiable(target: any, key: string)
{
CopiableProperties.push(key);
}
稍后在 mergeTo 方法中,您将能够遍历存储在 CopiableProperties 中的所有可复制 属性 名称。
这可能有点矫枉过正,但它可以让您避免重复。 希望这有帮助。