如何使用 Typescript 语言服务获取 属性 信息

How to get property info by using the Typescript language service

如何使用 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 语言服务returns结果:

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

我缺少的信息是类型(字符串、数字、Map<>、任意)以及它是数组还是对象,例如

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

知道如何实现吗?

非常感谢您的帮助。

找到了解决方案,不知道我一开始是怎么错过的。 Nicholas Wolverson 有一篇关于它的精彩博客 post。使用 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)); });

这将return需要的信息

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

结果:

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

详情请使用(code, mirror_code, blog post)。