带有导入语句的 TypeScript 智能感知 - VS 代码

TypeScript intellisense with import statement - VS Code

我希望 VSCode 智能感知能够理解我的 TS import 语句的语义。如果是这样,那么 VSCode 可以尝试将这些语句解析为文件并从这些文件中提取类型而无需任何注释。有时它可以,如果它可以找到导出我正在导入的内容的打字稿文件。但是,有时它无法做到这一点,特别是当我导入一个已使用环境声明键入的库时。但是几乎所有我想导入的东西都是用环境声明键入的,所以这很重要。

我知道这很复杂,因为 import 语句根据模块标志编译成不同的东西,并且生成的导入语句可以有一个额外的运行时路由层,这会混淆一个简单的文件 -基于搜索策略。

在一个完美的世界里,既然我们在做梦,我希望能够引用一个requirejs config object, defined as a standalone json file or literally defined in tsconfig.json, and have VS Code use requirejs routing semantics来解析导入的moduleid到一个文件磁盘(或者当我的导入语句在运行时无法解析为模块时在编译时警告我)。

但是,即使能够仅让智能感知搜索列表中的所有路径以试探性地找到我正在导入的模块也会很好,而且这将与模块加载程序无关。通过在顶部施加像 requirejs 这样的路由层,理论上可以解析到与 TS 找到的模块不同的模块;在大多数情况下它会起作用,但可以用注释处理古怪的事情。


我认为目前在任何编辑器中都不可能实现这些功能,包括 VSCode。很可能他们将来会在那里,但就目前而言,我很好奇其他人是如何获得智能感知的。我愿意竭尽全力避免 <reference path=.../> 注释,因为它们是代码重复。

我的一些库是使用 DefinitelyTyped 包类型化的,但其中一些不是,例如,其中一些是已经浏览器化的内部模块。所以 tsd 不是一个完整的解决方案。

一级 "solution" 是简单地使项目的所有类型在每个文件中可用,例如通过合并整个项目中的每个类型声明,包括来自 .d.ts 文件的环境模块,然后引用该集合,只要两个环境模块没有命名空间冲突。此解决方案一直有效,直到出现命名空间冲突,然后它永久停止工作。所以我不太喜欢这个主意。

还有更好的吗?有没有人让 tsserver 工作?我几乎找不到关于它的文档——我只知道它存在,因为我注意到它是在我安装节点的 tsc 实现时安装的。

Has anyone gotten tsserver to work

它是给编辑的。您正在寻求的自定义需要进入 编译器 而不是 TSServer。

并且在计划中

看到这个问题:https://github.com/Microsoft/TypeScript/issues/2338

2 件事会发生:

  • TypeScript 将能够解析为 .d.ts 文件,就像 require 解析为 .js 文件一样。

  • 您将能够使用路径映射配置此分辨率,该路径映射将是 requirejs + systemjs 路径映射的超集。

TypeScript 团队随后解决了我所有的顾虑。他们提供了 tsconfig.json 的扩展,允许我们声明模块解析并模仿所有主要模块系统(requirejs、webpack、browserify)的解析策略。

都在这里https://www.typescriptlang.org/docs/handbook/module-resolution.html