• 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 } ]
    
  • 相关阅读:
    pads layout模块复用-两个不同功能的复用模块功能
    摘抄:一个电容都能讲得如此全面实用,不分享就太可惜了!
    layout需要非常了解清楚的内容
    摘抄:一篇文章看看能不能讲透“阻抗匹配”
    python2.7/3.7安装NumPy函数库的一种方法及小心得
    3.C#基础之基本概念(完成)
    2.C#基础之词法结构(完成)
    .NET、.NET框架、ASP.NET和C#的关系(完成)
    1.C#基础之简介(完成)
    2.LINQ(新手写的!新手写的!新手写的!)(未完成)
  • 原文地址:https://www.cnblogs.com/steven-yang/p/7731874.html
Copyright © 2020-2023  润新知