我正在为外部依赖项构建 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 中使用。
有谁知道如何限制这样的项目中的类型?项目参考不是不可能吗?
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
作为包管理器时