即使未包含在“typeRoots”或“types”中,库也会显示在 Intellisense 中

问题描述 投票:0回答:1

我正在为外部依赖项构建 Typescript 声明文件,并且正在努力让我的

tsconfig.json
文件仅导致指定类型出现在 VSCode 的 Intellisense 中。

能够让我的库的类型成功显示,但我不能能够阻止其他库的显示。

例如,当我将文本

filter
添加到新的
.ts
文件中时,VSCode 自动完成选项包括 Lodash 库中的
filter
,尽管我没有将 Lodash 包含在我的
tsconfig
中。

我猜这与我设置

tsconfig.json
的方式有关,或者与Typescript“项目引用”的某些限制有关。

这是我的文件结构:

  • ./tsconfig.json
    (根配置)
  • ./gml/tsonfig.json
    (我正在开发的图书馆)
  • ./gml/typings/
    (我的图书馆
    .d.ts
    文件所在)
  • ./gml/test.ts
    (我正在测试类型智能感知的文件)
  • ./src/
    (我想要通过项目引用单独管理类型的相关项目)
  • ./node_modules/
    (根node_modules,其中确实包括Lodash和
    ./src/
    中项目使用的其他库)

我的配置:

// Root tsconfig
{
  "include": [],
  "exclude": ["node_modules"],
  "typeAcquisition": { "enable": false },
  "compilerOptions": {
    "baseUrl": ".",
    "typeRoots": [],
    "types": []
  },
  "references": [
    {
      "path": "./src/"
    },
    {
      "path": "./gml/"
    }
  ]
}
// ./gml/tsonfig.json
{
  "include": ["./"],
  "exclude": ["node_modules"],
  "typeAcquisition": { "enable": false },
  "compilerOptions": {
    "composite": true,
    "allowJs": true,
    "noEmit": true,
    "lib": ["es2015"],
    "typeRoots": ["./typings"],
    "target": "es2020",
    "module": "none",
    "skipLibCheck": true,
    "strict": true,
    "baseUrl": "."
  }
}

我排除了

typeAcquisition
typeRoots
types
中的任何一个,以便在指定时成功地将我的库列入允许名单,但无论我插入所有这些库,我最终仍然会在我的根目录中得到这些内容
node_modules/@types
./gml
内可在 Intellisense 中使用。

有谁知道如何限制这样的项目中的类型?项目参考不是不可能吗?

typescript visual-studio-code tsconfig
1个回答
0
投票

原因

VS Code 的 Typescript 语言服务器意外获取包的原因很可能是项目中的某些(!)源文件从包中导入(间接地)依赖于您获得 Intellisense 的包。

请注意,一个文件具有这样的导入就足够了,并且导入包的(传递)

dependencies
的智能感知也将在所有其他源文件中可用。

示例

例如,在以下源文件中,Typescript 知道

setImmediate
,因为从
@types/http-proxy
导入(未使用且无效),因为
@types/http-proxy
dependency
上有
@types/node

import { x } from '@types/http-proxy'

setImmediate(() => {})

如果删除或注释掉该导入,Typescript 将显示

ts(2304)
错误:
Cannot find name 'setImmediate'

有人建议自 2021 年起将

@types/*
dependency
@types/node
更改为
devDependency
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/55519

上面的示例使用以下内容

tsconfig.json
:

{
    "compilerOptions": {
        "types": [],
        "typeRoots": []
    }
}

调试

要列出 Typescript 来源进行编译和类型检查的文件,您可以执行以下命令:

tsc --listFiles --noEmit

使用导入来查看哪些导入导致包含哪些文件。将 Typescript 的编译器选项

skipLibCheck
设置为
true
可能会有所帮助,以仅列出文件,并且跳过检查库内的任何内容。

注意编译器选项

  • module
    影响进口的解决方式
  • preserveSymlinks
    影响 Typescript 来源的文件,尤其是使用
    pnpm
    作为包管理器时
© www.soinside.com 2019 - 2024. All rights reserved.