【发布时间】:2015-07-31 02:23:18
【问题描述】:
我希望 VSCode 智能感知能够理解我的 TS import 语句的语义。如果是这样,那么 VSCode 可以尝试将这些语句解析为文件,并从这些文件中提取类型而无需任何注释。有时它可以,如果它可以找到导出我正在导入的内容的打字稿文件。但是,有时它无法做到这一点,特别是当我导入一个使用环境声明键入的库时。但几乎我要导入的所有内容都是使用环境声明键入的,所以这很重要。
我知道这很复杂,因为import 语句根据模块标志编译成不同的东西,并且生成的导入语句可能有一个额外的运行时路由层,这会混淆简单的基于文件的搜索策略。
在一个完美的世界中,因为我们在做梦,我希望能够引用一个requirejs config object,定义为一个独立的json文件或在tsconfig.json中定义,并且让 VS Code 使用 requirejs routing semantics 将导入的模块 ID 解析为磁盘上的文件(或者在编译时警告我,当我的导入语句在运行时无法解析为模块时)。
但是,即使能够让智能感知搜索列表中的所有路径以启发式地找到我正在导入的模块也会很好,这与模块加载器无关。使用像 requirejs 这样的路由层,理论上可以解析到与 TS 找到的模块不同的模块;在大多数情况下,它会起作用,但可以使用注释来处理古怪的问题。
我认为目前在包括 VSCode 在内的任何编辑器中都不可能实现这些功能。他们很可能将来会在那里,但现在,我很好奇其他人是如何获得智能感知的。我愿意竭尽全力避免<reference path=.../> 注释,因为它们是代码重复。
我的一些库是使用DefiniteTyped 包进行类型化的,但其中一些不是,例如,其中一些是经过浏览器化的内部模块。所以 tsd 并不是一个完整的解决方案。
一个级别的“解决方案”是简单地使项目的所有类型在每个文件中都可用,例如通过合并来自整个项目的每个类型声明,包括来自 .d.ts 文件的环境模块,然后引用该聚集,只要两个环境模块没有命名空间冲突。此解决方案一直有效,直到发生命名空间冲突,然后永久停止工作。所以我不太喜欢这个主意。
还有什么更好的吗?有人让 tsserver 工作吗?我几乎找不到关于它的文档——我只知道它存在,因为我注意到它是在我安装 node 的 tsc 实现时安装的。
【问题讨论】:
-
VSCode 确实理解 ES6 导入语句,并且智能感知按您的预期工作。如果您在项目中创建
tsconfig.json,VSCode 将默认包含该目录和子目录中的所有.ts文件。除此之外,我不确定您要的是什么。 -
它有时确实能理解它们,但在我提到的情况下却失败了。
标签: typescript visual-studio-code