【问题标题】:How to get property info by using the Typescript language service如何使用 Typescript 语言服务获取属性信息
【发布时间】:2021-08-17 16:32:47
【问题描述】:

如何使用 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

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

非常感谢您的帮助。

【问题讨论】:

    标签: typescript languageservice


    【解决方案1】:

    找到了解决方案,不知道我是怎么错过的。 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)。

    【讨论】:

    • atom.io/packages/atom-typescript 使用 lasagne 服务“getQuickInfo”是否可以很好地使用这些工具提示
    • 也可以从语言服务方法'getProgram'获取程序
    • 你说的完全正确。我可以使用 getQuickInfoAtPosition 来获取我需要的信息,但是在其位置查找每个项目有点不舒服。感谢getProgram 的留言,您知道我想使用getProgram 时是否需要实现编译器主机?或者我可以留在 languageservicehost 吗?
    • 只是语言服务主机
    • 做了快速检查。 getProgram 即将在 TS 版本 1.5 中出现。 1.4 还没有。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多