使用 Typescript 或 javascript 动态获取 class 成员名称和值
Dynamically get class members names and values using Typescript or javascript
我对这些语言还很陌生,我确信它没有那么复杂,但找不到如何动态遍历 class 实例变量。
我正在尝试使用 Angular 在 table 中显示实例的变量。我想编写一个可以与任何 class.
一起使用的函数
假设我有一个工作簿 class:
export class workbookEntity {
public name: string;
public creationDate: string;
constructor() {
this.name = 'my work book name';
this.creationDate = '2018/01/26';
}
}
假设我想在另一个 class' 函数中获取此 class 实例的变量的名称和值:
export class showClassComponent {
// some code here
whenSubmitedInHtmlForm(className: string): void {
// do something to walk through instance
// with className parameter = 'workbookEntity'
}
// more code there
}
您将如何遍历实例以获取每个变量的名称和值以获得这样的结果?
[
{
name: 'name',
value: 'my work book name'
},
{
name: 'creationDate',
value: '2018/01/26'
}
]
没有反射的概念,在Typescript中这么多,所以你不一定能做类型查找。但是您也许可以按照...
export class showClassComponent {
var classes = [ { name: 'workBookEntity', value: new WorkBookEntity() }]
whenSubmitedInHtmlForm(className: string): void {
let c = classes.filter(class => class.name == className)[0];
if(c) {
let ret = [];
for (var key in c) {
if (c.hasOwnProperty(key)) {
ret.push({ name: key, value: c[key] });
}
}
return ret;
}
}
// more code there
}
如果您希望能够保留准确的类型信息,您可以创建一个 pick 实用函数,然后将它导入到您的 class 模块中您需要使用它的任何地方。
let workBook = new WorkbookEntity();
export function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
let newObj = {} as Pick<T, K>;
for (const key of keys) {
newObj[key] = obj[key];
}
return newObj;
}
console.log(pick(workBook, ['name', 'creationDate']));
// log: { name: 'my work book name', creationDate: '2018/01/26' }
如果你能够处理多个对象,那么你可以将第一个函数导入另一个实用函数。
export function pickObjects<T extends object, K extends keyof T>
(objects: T[], keys: K[]): Pick<T, K>[] {
return objects.reduce((result, obj) => [...result, pick(obj, keys)], []);
}
let workbooks = pickObjects([workBook, workBook2], ['name']);
workbooks[0].name // this exists
workbooks[0].age // Typescript error.
编辑器会显示年龄不存在,因为我们没有选择它
我对这些语言还很陌生,我确信它没有那么复杂,但找不到如何动态遍历 class 实例变量。
我正在尝试使用 Angular 在 table 中显示实例的变量。我想编写一个可以与任何 class.
一起使用的函数假设我有一个工作簿 class:
export class workbookEntity {
public name: string;
public creationDate: string;
constructor() {
this.name = 'my work book name';
this.creationDate = '2018/01/26';
}
}
假设我想在另一个 class' 函数中获取此 class 实例的变量的名称和值:
export class showClassComponent {
// some code here
whenSubmitedInHtmlForm(className: string): void {
// do something to walk through instance
// with className parameter = 'workbookEntity'
}
// more code there
}
您将如何遍历实例以获取每个变量的名称和值以获得这样的结果?
[
{
name: 'name',
value: 'my work book name'
},
{
name: 'creationDate',
value: '2018/01/26'
}
]
没有反射的概念,在Typescript中这么多,所以你不一定能做类型查找。但是您也许可以按照...
export class showClassComponent {
var classes = [ { name: 'workBookEntity', value: new WorkBookEntity() }]
whenSubmitedInHtmlForm(className: string): void {
let c = classes.filter(class => class.name == className)[0];
if(c) {
let ret = [];
for (var key in c) {
if (c.hasOwnProperty(key)) {
ret.push({ name: key, value: c[key] });
}
}
return ret;
}
}
// more code there
}
如果您希望能够保留准确的类型信息,您可以创建一个 pick 实用函数,然后将它导入到您的 class 模块中您需要使用它的任何地方。
let workBook = new WorkbookEntity();
export function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
let newObj = {} as Pick<T, K>;
for (const key of keys) {
newObj[key] = obj[key];
}
return newObj;
}
console.log(pick(workBook, ['name', 'creationDate']));
// log: { name: 'my work book name', creationDate: '2018/01/26' }
如果你能够处理多个对象,那么你可以将第一个函数导入另一个实用函数。
export function pickObjects<T extends object, K extends keyof T>
(objects: T[], keys: K[]): Pick<T, K>[] {
return objects.reduce((result, obj) => [...result, pick(obj, keys)], []);
}
let workbooks = pickObjects([workBook, workBook2], ['name']);
workbooks[0].name // this exists
workbooks[0].age // Typescript error.
编辑器会显示年龄不存在,因为我们没有选择它