TypeScript 将未导出的成员添加快速修复以解决未解析的符号错误

xe55xuns  于 4个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(132)

搜索词

import
export
unexported
symbols
auto import
completion
global
globals
intellisense

建议

tsserver 可以自动补全其他模块导出的符号,并添加一个导入语句来导入你选择的符号。
它还应该建议来自其他模块的 全局符号 ,这些符号没有被导出,如果选择了建议,则添加 export 关键字。

用例

当我编写一个模块时,我无法预测它的每一个使用场景,我只导出我认为其他模块需要使用的全局符号。但是当我在处理另一个模块时,我意识到我想使用一个没有被其他模块导出的符号(也许我甚至不记得它是否被导出),我希望我的编辑器为我导出和导入它,而不是让我自己手动找到该符号(因为即使 go-to definition 也不起作用),然后导出它,再回去自动补全以自动导入。
这在将 Web 项目转换为使用 imports 时也非常非常有用。你可以轻松地解决所有 "未声明的符号" 错误,并通过自动补全来导出和导入正确的符号。

示例

  • module.ts*:
function foo(name = 'World') {
  console.log('Hello ' + name);
}

export function bar() {
  foo();
}
  • app.ts*:
import { bar } from './module.ts';

bar();

我现在想要自定义 "hello" 消息,所以我开始输入 foo ,然后等待包含从 module.ts 中的函数 foo 的完成建议。
选择后,符号 foo 将自动为我导出和导入,我可以立即使用它:

  • module.ts*:
export function foo(name = 'World') {
  console.log('Hello ' + name);
}

export function bar() {
  foo();
}
  • app.ts*:
import { bar, foo } from './module.ts';

bar();
foo('TypeScript');

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性的更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、带有 JavaScript 输出的非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分一致。
mwg9r5ms

mwg9r5ms1#

对于补全功能,这将是一个性能和可预测性问题(标签补全应该永远不会改变除了你正在编辑的文件之外的其他文件)。
当你输入名称但无法解析为任何内容时,如果已经导入的文件中有一个具有该名称的未导出声明,那么提供导出它并将其导入到当前文件中的选项似乎是完全合理的。
稍微更改标题以反映这一点

2o7dmzc5

2o7dmzc52#

我不同意你的任意规则,我认为在选项卡补全中提供这个功能是完全合理的,只要选择该选项的后果反映给用户(自动导入在选项卡补全选项中反映,为什么不是“自动导出+导入”?)。
但我想快速修复只是一半的解决方案,所以对我来说现在听起来不错。
为了澄清,我的用例是将一个没有模块系统的JS代码库(甚至不是CommonJS)转换为ES6模块。有了这个快速修复,我可以遍历所有未声明的符号错误并应用快速修复,它会自动添加导入。
但是你要求文件应该已经被导入,这意味着我不得不在代码库中的每个文件里添加假导入,只是为了让快速修复起作用。最好让它查看当前项目中的所有文件( jsconfig.json / tsconfig.json )。

相关问题