TypeScript: Week Reflection

TypeScript: Week Reflection

Introduction

Type Script already provide decorators to help developers implement reflection. If we use the technique decorators, we have to add decorators on the target class during developing. But is there a way to find members of a specific instance?

Here is a code to reflect an object instance by using JSON functions. The limitations:

  • Must provide an class instance
  • Cannot find members which have not be initialed.
  • Cannot find the class of a member
  • Only can provide typeof and isArray attributes.

Source Code

  • Source
export class ReflectMemberInfo {
    constructor(public name:string, public type: string, public isArray: boolean) {
    }
}

export class WeekReflector {
    members: ReflectMemberInfo[] = [];
    reflect(obj: any): void {
        JSON.stringify(obj, (key, value) => {
            if (key == '') {
                // it is the root object
                return value;
            }

            var isArray = (value instanceof Array);
            this.members.push(new ReflectMemberInfo(key, typeof(value), isArray));
            return null;
        });
    }
}

// Test
class TestObject {
    memberBoolean: boolean = false;
    memberNumber: number = 1;
    memberString: string = "Jack";
    // memberSymbol: Symbol = Symbol();
    memberUndefined?: string = undefined; // type is undefined
    memberNull: string | null = null;   // type is object
    memberCannotFound: string;      // cannot be reflected
    memberObject: TestNestedObject = new TestNestedObject();
    // type is object
    memberStringArray: string[] = ["A", "B", "C"];      
    // type is object
    memberObjectArray: TestNestedObject[] = [new TestNestedObject(), new TestNestedObject()];
    // type is function
    memberFunction: Function = () => {};
    // cannot be reflected
    public normalFunc(): any {
        return null;
    }
    
}

class TestNestedObject {
    nestedNumber: number = 2;
    nestedString: string = "Mike";
    nestedNull: string | null = null;
    nestedUndefined?: string = undefined;
    nestedStringArray: string[] = ["A", "B", "C"];
}

var reflector = new WeekReflector();
reflector.reflect(new TestObject());
console.log(reflector.members);
  • Result
[ ReflectMemberInfo { name: 'memberBoolean', type: 'boolean', isArray: false },
  ReflectMemberInfo { name: 'memberNumber', type: 'number', isArray: false },
  ReflectMemberInfo { name: 'memberString', type: 'string', isArray: false },
  ReflectMemberInfo { name: 'memberUndefined', type: 'undefined', isArray: false },
  ReflectMemberInfo { name: 'memberNull', type: 'object', isArray: false },
  ReflectMemberInfo { name: 'memberObject', type: 'object', isArray: false },
  ReflectMemberInfo { name: 'memberStringArray', type: 'object', isArray: true },
  ReflectMemberInfo { name: 'memberObjectArray', type: 'object', isArray: true },
  ReflectMemberInfo { name: 'memberFunction', type: 'function', isArray: false } ]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

java开发_mysql中获取数据库表描述_源码下载

我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_element_config中记录结果

35920
来自专栏Deen的代金券日记

再看SQL注入过滤列名如何注出数据

获取表名可以使用innodb_index_stats,mysql5.5版本级以上,默认使用Innode作为存储引擎。

72210
来自专栏大前端_Web

SQL笔记

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

13920
来自专栏流柯技术学院

MySQL存储过程

SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的...

28630
来自专栏Leetcode名企之路

【Leetcode】175. 组合两个表

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

9610
来自专栏码匠的流水账

sentinel自定义DataSource实战

本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。

27910
来自专栏芋道源码1024

Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析

1. 概述 2. SQLParsingEngine 3. SQLParser SQL解析器 3.2.1 #parseExpression() 和 SQLExp...

48550
来自专栏me的随笔

T-SQL基础(三)之子查询与表表达式

在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。

10510
来自专栏康怀帅的专栏

MySQL 函数

函数相关内容。 字符函数 字符连接 CONCAT('a','b') 使用指定分隔符进行字符连接 CONCAT_WS('-','a','b') 数字格式化 FOR...

34140
来自专栏me的随笔

T-SQL基础(三)之子查询与表表达式

在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。

12140

扫码关注云+社区

领取腾讯云代金券