如何让 VS Code 识别单回购包之间的打字稿声明?

Posted

技术标签:

【中文标题】如何让 VS Code 识别单回购包之间的打字稿声明?【英文标题】:How can I make VS Code recognize typescript declarations between mono-repo packages? 【发布时间】:2022-01-03 06:08:46 【问题描述】:

我有一个单存储库项目,配置了一个独立的库包(仅限 TS)和另一个 Web UI 包(TS + React)。

我正在从消费者 (Web UI) 包中导入已编译的库包。为此,我使用 yarn 来链接包和 parcel 以生成库包的分发文件。

Parcel 会在库包的dist 文件夹中自动生成一个d.ts 文件。

我使用 VS Code 作为 IDE,当我打开导入库并使用它的消费者包文件时,VS Code 无法识别库包的 d.ts 文件中声明的类型。

这是包的结构:

rootPackage
|- library
|- web-ui

library 包中,我有一个types.ts 文件和一个index.ts 文件。只有一个类型被导出:

export type ParamType = "a" | "b" | "c";

我在这个包上使用parcel watch 来在更改某些内容时自动刷新dist 文件。

Parcel 正在生成 main.d.ts 文件,并且该文件被 package.jsontypes 属性引用。

当我尝试通过 web-ui 包的代码使用此 ParamType 类型时,我在类型中突出显示以下 IDE 错误:

Cannot find name 'ParamType'.ts(2304)

当我在 web-ui 包中运行 parcel 时,它编译得很好,并且浏览器加载时没有问题/警告。

我认为这是一个与 VS Code 相关的问题,我不知道如何解决。


编辑 1

我创建了一个public repository on GitHub 来演示这个问题。 如果您知道如何修复它,请随时创建拉取请求,这将非常有帮助。

【问题讨论】:

你能在 github repo 中分享一个简化的复制品吗?需要注意的一件事是 Parcel 默认情况下不进行类型检查,除非您配置 @parcel/validator-typescript plugin - 所以它可能不是特定于 VSCode 的问题。当您尝试使用 tsc 对 web-ui 项目进行类型检查时会发生什么? 嗨@AndrewStegmaier,我刚刚编辑了添加对存储库的引用的问题。关于运行 tsc,我还没有创建 tsconfig.json 文件。快速尝试后,报错:src/App.tsx:6:23 - error TS2304: Cannot find name 'ParamType'. 【参考方案1】:

从您的example repo 来看,您的library 包的根如下所示:

/shared/lib/src/index.ts

import  ParamType  from "./types";

const Library = 
  typedParamMethod(param: ParamType) 
    console.log(param);
  ,
;

export default Library;

而您在web-ui 包中使用library 包的方式是这样的:

/ui/web/src/App.tsx

import React from 'react';
import Library from 'library';

function App() 
  React.useEffect(() => 
    const typedParam: ParamType = 'b'; // VSCode and tsc throw the error "Cannot find name 'ParamType'." 
    Library.typedParamMethod(typedParam);
  , []);

  return (
    <div className="web-ui">Web UI</div>
  );


export default App;

问题是您既没有将ParamType 从您的library 包的根目录导出,也没有将其导入您的web-ui 包。现代 javascript 和 Typescript 模块是相互隔离的 - library 包根中的 import ParamType from "./types" 行使 ParamType 在该文件中可用,但它不会影响(或污染)从library 包中导入其他东西(例如默认导出)的东西的全局命名空间。

要解决这个问题,将此行添加到library 包根目录(例如/shared/lib/src/index.ts):

export  ParamType  from "./types.ts";

然后将 web-ui 包中的导入(在 /ui/web/src/App.tsx 中修改为:

import Library,  ParamType  from 'library';

(问题和解决方案与 VSCode 无关 - 任何尝试对 web-ui 包进行类型检查的内容都会发出相同的错误,而无需进行这些更改)

【讨论】:

感谢您澄清这一点!我不知道我需要像这样导出所有类型。

以上是关于如何让 VS Code 识别单回购包之间的打字稿声明?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 VS Code 识别 ES7 绑定操作符

如何让 VS Code 智能感知识别附加到现有类的新方法

VS Code 中不一致的“找不到名称‘x’”打字稿错误

如何在 VS Code 中为模板中的 vue 道具启用 Typescript 打字和智能感知?

CODE[VS] 2951 打字比赛

VS Code:在保存文件时观看打字稿