2015-02-24 28 views
3

如何使用Typescript 1.4.0获取对象的属性类型。如何通过使用Typescript语言服务获取属性信息

我正在寻找类似于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; 
} 

打字稿语言服务返回结果:

{ 
    "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 
     } 
    ] 
} 

信息我缺少的是类型(str数字,地图<>,任何),并且如果它是数组或对象,例如

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

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

非常感谢您的帮助。

回答

1

找到解决方案,不知道我是如何错过它的。 Nicholas Wolverson有一个优秀的博客文章。使用TypeScript语言服务不是正确的选择。正确的解决方案是使用TypeScript编译器API。

var program = ts.createProgram([dummyScriptName], host.getCompilationSettings(), host); 
var typeChecker = program.getTypeChecker(true); 
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)了解详情。

+1

https://atom.io/packages/atom-typescript这些工具提示只是很好,使用烤宽面条服务“getQuickInfo” – basarat 2015-02-24 20:54:05

+2

此外,你可以从语言服务方法'getProgram' – basarat 2015-02-24 20:55:04

+0

得到程序你是绝对正确的。我可以使用getQuickInfoAtPosition来获取我需要的信息,但是在查找其位置上的每个项目时有点不舒服。感谢关于'getProgram'的注释,你知道当我想使用'getProgram'时是否需要实现编译器主机吗?还是我可以留在languageservicehost? – Karl2011 2015-02-24 21:52:12

相关问题