Language-tools: 内置元素的类型被覆盖

创建于 2020-06-25  ·  14评论  ·  资料来源: sveltejs/language-tools

描述错误
如果安装了一些以某种方式覆盖 React 类型的@types/* npm 模块,那么类型检查就会变得一团糟。 我可以想象为什么会发生这种情况,但如果能以某种方式修复它会很好。 就我而言,我使用的是故事书(使用 Svelte),但它安装了一堆@types/*模块,这些模块以某种方式弄乱了语言服务器用户的类型。 我还没有确定哪个类型的模块是罪魁祸首。 但理想情况下,语言服务器类型应该胜过其他类型。

再现
重现行为的步骤:

  1. 安装@storybook/addon-knobs npm 模块
  2. 触发 TS 类型以某种方式加载,例如通过导入模块
  3. 简单的 HTML 现在会触发类型错误

触发错误的示例代码:

<script lang="typescript">
  import * as foo from '@storybook/addon-knobs';
</script>

<div>
  <p></p>
</div>

预期行为
HTML 不会触发错误。

截图
image

系统(请填写以下信息):

  • 操作系统:Linux
  • IDE:VSCode
  • 插件/包:“Svelte Beta”、 svelte-language-serversvelte-check

附加上下文
svelte-check还会触发 IDE 中显示的相同错误。

Fixed bug documentation

所有14条评论

该模块加载全局类型定义,一些 React 类型定义。 还有其他人遇到这个问题,似乎还没有很好的解决方案,但存在解决方法
https://github.com/microsoft/TypeScript/issues/17042
https://github.com/microsoft/TypeScript/issues/18588

有一个可能的解决方法,也许您可​​以自己尝试一下。 如果可行,我们也可能会将该解决方法添加到 repo 中。

感谢@dummdidumm 的提醒。 那行得通! 供参考:

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "react": ["sink.d.ts"]
    }
  }
}

sink.d.ts

declare module 'react';

这是可以添加到语言服务器本身的东西,还是会为真正想在他们的项目中使用 React 类型的用户搞砸?

我不这么认为。 即使他这样做了,语言服务器也只在 svelte 文件上运行,所以如果他在 tsx/jsx 文件中,一切都应该正常工作。 我来补充一点。

您可以在nightly build上对此进行测试。

它是否已经部署到每晚构建? 不幸的是,它似乎不起作用。 但是,如果paths中还配置了tsconfig.json paths ,我认为baseUrl是必需的https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -映射。 我可以尝试将baseUrl到我的本地环境中,以验证它是否会起作用。

哦,没关系。 似乎更改尚未部署到每晚构建。 我明天再测试一下。

感谢您指出这一点,部署管道中存在错误(顺序混乱,因此扩展是使用前一天的 npm 包构建的)。

抱歉@dummdidumm 回复缓慢。 我测试了该修复程序,但不幸的是它不起作用,但我四处寻找并找到了必要的修复程序:

  1. 在这里,它应该是configJson.compilerOptions.paths而不是configJson.paths 。 小错误:)
    https://github.com/sveltejs/language-tools/blob/9b936fca70c03f86474aec40773c29a9b38805c2/packages/language-server/src/plugins/typescript/service.ts#L189 -L190

  2. 如果没有configJson.compilerOptions.baseUrl选项,它就不起作用。 这有点难修复。 首先,我们需要检查是否已经设置了,如果没有,快乐路径当然是configJson.compilerOptions.baseUrl = '.' 。 但是,如果设置了它,我们必须相对于用户设置为其基本 url 的任何内容来解析我们的路径。 这让事情变得有点复杂,但我相信有一种方法可以设计它。 我没有时间研究 atm,但我想引起您的注意。

我不确定是否需要baseUrl ,因为设置的类型具有绝对路径。 我认为 ts 服务尊重这一点。

感谢您指出compilerOptions错误😃 修复解决了打字问题。

关于svelte-check注意事项:如果您明天仍然遇到此错误,但不再出现在 IDE 中,请尝试卸载并重新安装svelte-check ,传递的svelte-language-server依赖项可能不会更新到最新版本。

感谢您的跟进@dummdidumm! 我再次对其进行了测试,可以确定如果未设置compilerOptions.baseUrl修复程序不起作用 :grinning: 然而,好消息是,如果用户设置了一些baseUrl ,它不会影响反应覆盖的分辨率,因为这是一个绝对路径。 我错误地认为我们需要一些黑客才能让它工作。

如果检测到当前的解决方案,它得到了工作,检查有没有compilerOptions.baseUrl在测试环境中的配置tsconfig.json

文档已添加。 我暂时将其保持打开状态,以便在有人收到错误但未阅读故障排除部分时更容易发现。

好消息,这是作为#351 的副作用修复的,在下一个生产版本之后,不再需要使用接收器的解决方法。

太棒了! 感谢您的提醒! :tada:

此页面是否有帮助?
0 / 5 - 0 等级