You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TypeScript无法识别自定义npm包index.d.ts中的类型问题求助

解决TypeScript包类型不被识别的问题

看起来你的TypeScript包已经生成了.d.ts文件,但消费它的项目无法正确识别类型,这通常是配置或构建流程中的小问题导致的。我来帮你一步步排查解决:

1. 先检查包的TypeScript编译配置

首先确保你的包的tsconfig.json配置正确,这是生成准确类型定义的基础:

{
  "compilerOptions": {
    "declaration": true, // 必须开启,这才会生成.d.ts文件
    "declarationDir": "./dist", // 指定类型文件输出到dist目录
    "outDir": "./dist", // JS代码输出目录
    "rootDir": "./src", // 源文件根目录,保证编译后目录结构和源码对应
    "strict": true, // 开启严格模式,有助于生成更严谨的类型
    "module": "CommonJS", // 和你package.json里的main字段匹配,适配Node.js环境
    "target": "ES6" // 按需设置,至少要兼容你的运行环境
  },
  "include": ["src/**/*"], // 确保所有源码都被编译
  "exclude": ["node_modules", "dist", "**/*.test.ts"] // 排除不需要编译的文件
}

配置好后,手动运行tsc,检查dist目录下的index.d.ts是否和你预期的一致,没有语法错误。

2. 确认package.json的关键配置

你的package.json已经设置了typesfiles字段,但有几个细节要注意:

  • 确保"types": "dist/index.d.ts"的路径完全正确,和实际文件位置匹配。
  • "files": ["dist/"]会确保npm发布(或本地安装)时包含dist下的所有文件,包括类型定义。
  • 如果是本地安装包(比如用npm install ../postgres-base-class),一定要先在包目录下运行npm run prepack——直接安装本地目录不会自动执行prepack脚本,所以需要手动触发构建,保证dist目录是最新的。

3. 解决本地开发的缓存问题

TypeScript和VSCode有时候会缓存旧的类型信息,试试这些操作:

  • 在消费项目中运行npx tsc --clearCache清除TypeScript缓存。
  • 重启VSCode的TypeScript服务:按下Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(Mac),输入TypeScript: Restart TS Server并执行。
  • 重新安装包:先卸载npm uninstall postgres-base-class,再重新安装(本地包的话就重新执行npm install ../path/to/package)。

4. 排查类型定义的导入和兼容性

  • 确保你在项目中正确导入类:
    import BasePostgresClass from 'postgres-base-class';
    
  • 检查消费项目的tsconfig.json,确保compilerOptions.moduleResolution"node"(默认就是这个,但如果改过的话会影响类型解析)。
  • 如果你用的是npm link来关联本地包,TypeScript可能无法自动识别link过来的类型,这时候可以在消费项目的tsconfig.json中添加paths配置,直接指向包的dist目录:
    {
      "compilerOptions": {
        "paths": {
          "postgres-base-class": ["../postgres-base-class/dist"]
        }
      }
    }
    

5. 验证node_modules中的类型文件

最后去消费项目的node_modules/postgres-base-class/dist目录下,打开index.d.ts确认:

  • 文件内容和你本地包的index.d.ts完全一致,没有缺失或被篡改。
  • execSql方法的类型定义protected execSql(query: QueryConfig): Promise<QueryResult>;是完整的,并且QueryConfigQueryResult确实从pg正确导入了(pg从v7开始自带类型定义,所以不用额外安装@types/pg)。

按照这些步骤走下来,应该就能让消费项目正确识别你的包的类型了。

内容的提问来源于stack exchange,提问作者John

火山引擎 最新活动