TypeScript: Week Reflection
2017-10-25 19:35
85 查看
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
Sourceexport 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 } ]
相关文章推荐
- 使用 Web API 作为动态 TypeScript 编译器运行环境
- TypeScript 0.9.1 发布,新增 typeof 关键字
- TypeScript: Interface vs Class vs Modules vs Program vs Function
- TypeScript让.Net开发人员更适应JavaScript
- webstorm自动编译typescript
- Typescript的面向对象
- 转载 《我用 TypeScript 语言的七个月》
- TypeScript 中接口详解
- 1 TypeScript SetUp for Webstorm
- 为什么要学习TypeScript
- TypeScript学习-类
- Web3DGame之路,Babylonjs 和TypeScript学习笔记(一)
- 转载:《TypeScript 中文入门教程》 11、声明合并
- TypeScript 5 Angular 2
- TypeScript入门-语法篇
- TypeScript 学习笔记2
- TypeScript学习资料
- WebStorm下使用TypeScript
- [TypeScript] Installing TypeScript and Running the TypeScript Compiler (tsc)
- Egret项目Typescript的编译报错