Node14 VSCode下TS npm包无智能提示的tsconfig配置方法
你遇到的全量类型丢失、智能提示失效的问题,本质是三个叠加的疏漏导致的,和下游项目的ESLint、编辑器配置无关:
- 缺少类型声明文件的生成配置,下游完全拿不到TS编译出来的类型信息,所有导入的内容都会被隐式推导为
any - 默认导出的写法和CommonJS模块的解析规则存在断层,哪怕有类型文件,导出的结构和下游require的取值逻辑也对不上
- npm包自身的元信息配置不全,编辑器根本找不到类型声明文件的入口路径
1. 调整tsconfig.json,开启类型声明文件输出
在现有compilerOptions中追加两个配置项:
"declaration": true, "declarationDir": "./dist"
开启后,TS在编译js文件时,会同步在dist目录下生成对应的.d.ts类型声明文件,这是所有智能提示的基础。
注意:该配置和你当前用的module: commonjs、target: es2020完全兼容,不会产生模块格式冲突
2. 修正入口文件的导出写法,适配CommonJS解析逻辑
你现在用的整对象默认导出,编译后生成的CommonJS逻辑会把导出的对象挂在exports.default属性上,这也是为什么你需要写const { default as package } = require('mypackage')才能在运行时拿到值,但类型结构和取值路径是错位的。
优先推荐改成直接命名导出的写法,完全适配CommonJS的导出规则,不需要额外解构default:
// 替换原有export default { ... }的写法 export const CoolClass = CoolClass export const CoolClass2 = CoolClass2 export const utils = { utilFunction, utilFunction2, }
这种写法编译后会直接把所有暴露的属性挂在模块的exports对象上,下游哪怕写const pkg = require('mypackage')就能直接拿到全部方法,对应的类型文件也会精准匹配每个属性的类型,不会出现隐式any。
如果一定要保留整对象导出的开发体验,可以给导出的对象加明确的类型注解,避免TS推导成松散的匿名对象类型:
// 先定义明确的导出结构类型 interface PackageExports { CoolClass: typeof CoolClass CoolClass2: typeof CoolClass2 utils: { utilFunction: typeof utilFunction utilFunction2: typeof utilFunction2 } } const exportsObject: PackageExports = { CoolClass, CoolClass2, utils: { utilFunction, utilFunction2, } } export default exportsObject
3. 补全npm包的package.json元信息
即使生成了类型声明文件,如果包的入口字段配置不对,下游编辑器也找不到对应的文件:
在包自身的package.json中补充两个核心字段:
{ "main": "./dist/index.js", "types": "./dist/index.d.ts" }
main字段指定Node.js运行时加载的编译后js入口,避免错误加载src下的TS源文件types字段指定TypeScript/编辑器加载的类型声明文件入口,没有这个字段,哪怕dist目录下有.d.ts文件,也不会被自动解析
完成上述配置重新编译发布包后,在下游Node.js v14项目中不需要修改任何现有代码,就能看到:
- 导入的包不再被推导为
any,类的实例、工具方法的参数类型都能正常识别 - 对象参数的可选属性、必填属性可以正常触发自动补全
- 悬停在代码上就能看到对应方法、类的类型定义
额外提醒:确保
.npmignore配置没有把dist/目录排除,否则本地编译测试正常,发布到npm后下游还是拿不到对应的js和类型文件。
内容的提问来源于stack exchange,提问作者Andre

