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 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

PL/SQL 嵌套记录与记录集合

    将多个逻辑上不相关列组合到一起形成了PL/SQL的记录类型,从而可以将记录类型作为一个整体对待来处理。而且PL/SQL记录类型可以进行 嵌套以及基于PL...

7520
来自专栏大前端_Web

SQL笔记

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

14020
来自专栏康怀帅的专栏

MySQL 函数

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

34140
来自专栏Leetcode名企之路

【Leetcode】175. 组合两个表

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

9610
来自专栏码匠的流水账

sentinel自定义DataSource实战

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

28110
来自专栏Hongten

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

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

36020
来自专栏芋道源码1024

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

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

48650
来自专栏张俊红

数据分析系列——SQL数据库

数据分析系列——SQL数据库 总第49篇 ▼ 本文知识只是用作于常用的数据分析中,并未涉及专业数据库搭建等知识。全篇分为四个部分:初识数据库、数据库的操作、数据...

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

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

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

73410
来自专栏数据库

MySQL数据库学习之两情相悦

1. MySQL的语法: 2. MySQL语法的定义顺序: (1) 指定查询的字段(2) 指定是否去重(3) 指定表名(4) 指定联表方式(5) 指定联表条件(...

21050

扫码关注云+社区

领取腾讯云代金券