4

如何使用 Typescript 1.4.0 获取对象属性的类型。

我正在寻找类似于 C# 的东西,它可以查找对象的属性。

var properties = typeof(T).GetProperties();
foreach( var property in properties){}

到目前为止,我所拥有的是:

var ls = ts.createLanguageService(host, ts.createDocumentRegistry())
var nav = ls.getNavigationBarItems(host.fileName);

给定示例接口:

interface Example {
    firstname: string;
    lastname: string;
    age: string;
}

TypeScript 语言服务返回结果:

{  
   "NavigationBarItems":[  
      {  
         "text":"Example",
         "kind":"interface",
         "kindModifiers":"",
         "spans":[  
            {  
               "start":0,
               "length":83
            }
         ],
         "childItems":[  
            {  
               "text":"age",
               "kind":"property",
               "kindModifiers":"",
               "spans":[  
                  {  
                     "start":69,
                     "length":12
                  }
               ],
               "childItems":[  

               ],
               "indent":0,
               "bolded":false,
               "grayed":false
            },
            {  
               "text":"firstname",
               "kind":"property",
               "kindModifiers":"",
               "spans":[  
                  {  
                     "start":24,
                     "length":18
                  }
               ],
               "childItems":[  

               ],
               "indent":0,
               "bolded":false,
               "grayed":false
            },
            {  
               "text":"lastname",
               "kind":"property",
               "kindModifiers":"",
               "spans":[  
                  {  
                     "start":47,
                     "length":17
                  }
               ],
               "childItems":[  

               ],
               "indent":0,
               "bolded":false,
               "grayed":false
            }
         ],
         "indent":0,
         "bolded":false,
         "grayed":false
      }
   ]
}

我缺少的信息是类型 (string,number,Map<>,any) 以及它是否是数组或对象,例如

"text":"lastname",
"kind":"property",
"type":"string",  //string,number,Map<>,any

任何想法如何实现这一目标?

非常感谢您的帮助。

4

1 回答 1

3

找到了解决方案,不知道我一开始是怎么错过的。Nicholas Wolverson有一篇关于它的优秀博客文章。使用 TypeScript 语言服务不是正确的选择。正确的解决方案是使用 TypeScript 编译器 API。

var program = ts.createProgram([dummyScriptName], host.getCompilationSettings(), host);
var typeChecker = program.getTypeChecker();
var sf = program.getSourceFile(dummyScriptName);
var decls = sf.getNamedDeclarations().map(function (nd) { return nd.symbol.name + ": " + typeChecker.typeToString(typeChecker.getTypeAtLocation(nd)); });

这将返回所需的信息

interface Person {
    firstname: string;
    lastname: string;
    age: number[];
}

结果:

Person: Person
firstname: string
lastname: string
age: number[]

详情请使用(codemirror_codeblog post)。

于 2015-02-24T19:16:04.017 回答