Javascript 在TypeScript文件中的光标下键入

Javascript 在TypeScript文件中的光标下键入,javascript,typescript,flowtype,type-inference,Javascript,Typescript,Flowtype,Type Inference,我想研究TypeScript代码中的某些推断类型。这对于正确的文件尤其有用,以确保推断的类型足够具体、准确和正确 给定TypeScript文件,如何在其中的特定位置获取类型,类似于pos的流类型 除此之外,我不需要任何其他复杂的工具,比如IDE集成。只是这个简单的功能。不幸的是,TypeScript没有以一种易于使用的方式公开类似的内容。TypeScript确实有一个语言服务器,您可以使用它来查询类型信息。这相对容易做,但很麻烦。基本上,您启动服务器并发送一些命令来打开项目和文件,然后发送一个命

我想研究TypeScript代码中的某些推断类型。这对于正确的文件尤其有用,以确保推断的类型足够具体、准确和正确

给定TypeScript文件,如何在其中的特定位置获取类型,类似于pos的流类型


除此之外,我不需要任何其他复杂的工具,比如IDE集成。只是这个简单的功能。

不幸的是,TypeScript没有以一种易于使用的方式公开类似的内容。TypeScript确实有一个语言服务器,您可以使用它来查询类型信息。这相对容易做,但很麻烦。基本上,您启动服务器并发送一些命令来打开项目和文件,然后发送一个命令来请求信息

如果您全局安装了typescript(
npm安装-g typescript
),您应该能够在
tsserver
可执行文件下运行typescript服务器。否则,您可以通过将其定位在typescript模块内的
bin
文件夹中来运行它

命令从stdin发送,响应通过stdout发送。这些命令只是JSON,并以新行终止

您要发送的第一个命令是
openExternalProject

{"type":"request","command":"openExternalProject","arguments":{"projectFileName":"/path/to/tsconfig.json","rootFiles":[],"options":{}}}
/path/to/tsconfig.json
替换为
tsconfig.json
文件的路径

下一个命令是打开一个文件:

{"type":"request","command":"open","arguments":{"file":"/path/to/file.ts"}}
获取类型信息的最后一个命令是
quickinfo

{"type":"request","command":"quickinfo","arguments":{"offset":9,"line":5,"file":"/path/to/file.ts"}}
值替换为所需信息类型的行,并将
偏移量
替换为行偏移量

您应该从服务器获得类似以下内容的响应:

{"seq":0,"type":"response","command":"quickinfo","success":true,"body":{"kind":"alias","kindModifiers":"","start":{"line":5,"offset":8},"end":{"line":5,"offset":19},"displayString":"(alias) const MyComponent: new () => MyComponent\nimport MyComponent","documentation":"","tags":[]}}
以下是我在测试时的完整请求/响应:

> ./tsserver
Content-Length: 76

{"seq":0,"type":"event","event":"typingsInstallerPid","body":{"pid":63491}}
{"type":"request","command":"openExternalProject","arguments":{"projectFileName":"/test/tsconfig.json","rootFiles":[],"options":{}}}
Content-Length: 526

{"seq":0,"type":"event","event":"telemetry","body":{"telemetryEventName":"projectInfo","payload":{"projectId":"489d647358fb01382e6efc991212c7fd2bd8d16a91e6b960aa17b2c86ff9cb25","fileStats":{"js":0,"jsSize":0,"jsx":0,"jsxSize":0,"ts":0,"tsSize":0,"tsx":0,"tsxSize":0,"dts":0,"dtsSize":0,"deferred":0,"deferredSize":0},"compilerOptions":{},"typeAcquisition":{"enable":true,"include":false,"exclude":false},"compileOnSave":true,"configFileName":"other","projectType":"external","languageServiceEnabled":true,"version":"3.7.2"}}}
Content-Length: 87

{"seq":0,"type":"response","command":"openExternalProject","success":true,"body":true}
Content-Length: 415

{"seq":0,"type":"event","event":"setTypings","body":{"projectName":"/test/tsconfig.json","typeAcquisition":{"include":[],"exclude":[],"enable":true},"compilerOptions":{"allowNonTsExtensions":true,"noEmitForJsFiles":true},"typings":["/Users/so-test/Library/Caches/typescript/3.7/node_modules/@types/react/index.d.ts"],"unresolvedImports":[],"kind":"action::set"}}
Content-Length: 415

{"seq":0,"type":"event","event":"setTypings","body":{"projectName":"/test/tsconfig.json","typeAcquisition":{"include":[],"exclude":[],"enable":true},"compilerOptions":{"allowNonTsExtensions":true,"noEmitForJsFiles":true},"typings":["/Users/so-test/Library/Caches/typescript/3.7/node_modules/@types/react/index.d.ts"],"unresolvedImports":[],"kind":"action::set"}}
{"type":"request","command":"open","arguments":{"file":"/test/App.tsx"}}
Content-Length: 272

{"seq":0,"type":"event","event":"projectLoadingStart","body":{"projectName":"/test/tsconfig.json","reason":"Creating possible configured project for /test/App.tsx to open"}}
Content-Length: 150

{"seq":0,"type":"event","event":"projectLoadingFinish","body":{"projectName":"/test/tsconfig.json"}}
Content-Length: 239

{"seq":0,"type":"event","event":"configFileDiag","body":{"triggerFile":"/test/App.tsx","configFile":"/test/tsconfig.json","diagnostics":[]}}
{"type":"request","command":"quickinfo","arguments":{"offset":9,"line":5,"file":"/test/App.tsx"}}
Content-Length: 283

{"seq":0,"type":"response","command":"quickinfo","success":true,"body":{"kind":"alias","kindModifiers":"","start":{"line":5,"offset":8},"end":{"line":5,"offset":19},"displayString":"(alias) const MyComponent: new () => MyComponent\nimport MyComponent","documentation":"","tags":[]}}
也许有一种更有效的方式来查询语言服务器,但这是我在短时间内就想到的

您可以在此处查看所有可能的请求/响应:


希望这能有所帮助。

您是在寻找一个可以实现这一点的编程库,还是一个可以用来直观地查看这些信息的工具?@AlexanderO'Mara我正在寻找一个工具,但我前面提到的“工具”被社区禁止,因为一些与工具相关的规则。我的目的是接收关于typescript文件的一些信息和见解,除了明显的错误。这是为了研究和教育目的。我一直在这样使用flow工具。谢谢您的回答。我想把
tsserver
作为实现这一目标的最后手段。如果它在IDE中是可能的,那么它必须在任何地方都是可能的。但我偶然发现typescriptlang上缺少tsserver的API文档。你给我的基本信息+protocol.d.ts足以让我建立一个简单的工具。