电脑港
白蓝主题五 · 清爽阅读
首页  > 软件应用

TypeScript生成声明文件:手把手教你让JS库也能享受类型提示

你在用某个 JavaScript 时,是不是经常在 VS Code 里敲到一半,突然发现没有智能提示?函数参数是啥、返回值长什么样,全靠翻文档、猜、试错?别急,这多半是因为这个库没提供 TypeScript 声明文件(.d.ts)。

声明文件到底有啥用?

简单说,它就是给 JS 代码“贴标签”——告诉 TypeScript 这个函数接收几个参数、每个参数是 string 还是 number、返回值是什么型。有了它,编辑器就能自动补全、类型校验、实时报错,写代码像开了导航。

自己写的 JS 库,怎么生成 .d.ts?

如果你正开发一个 JS 工具包(比如封装了一套日期处理函数),想让 TS 用户也爽一把,最省事的办法就是用 TypeScript 自带的 tsc --declaration

假设你项目结构长这样:

my-utils/
├── src/
│ ├── index.js
│ └── format.js
├── package.json
└── tsconfig.json

先装 TypeScript:

npm install -D typescript

再配个 tsconfig.json(哪怕你写的是 JS):

{
"compilerOptions": {
"allowJs": true,
"declaration": true,
"emitDeclarationOnly": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src/**/*"]
}

然后执行:

npx tsc

运行完,dist/ 下就会多出 index.d.tsformat.d.ts——这就是自动生成的声明文件。

但光靠自动推导不够准?加 JSDoc 就行

TS 推导类型有时会保守,比如把 function add(a, b) { return a + b; } 的参数全标成 any。这时候,在 JS 文件里写几行 JSDoc,效果立竿见影:

/**
 * 计算两个数字之和
 * @param {number} a 第一个数
 * @param {number} b 第二个数
 * @returns {number}
 */
function add(a, b) {
  return a + b;
}

再跑一遍 tsc,生成的 .d.ts 就会是:

declare function add(a: number, b: number): number;

发布到 npm 的小细节

想让用户 npm install my-utils 后直接用上类型?记得在 package.json 里加上这两行:

{
"types": "dist/index.d.ts",
"main": "dist/index.js"
}

同时确保 dist/ 目录随包一起发布(检查 files 字段或删掉 .npmignore 里对 dist 的排除)。

第三方 JS 库没声明?临时自己写一个

遇到老项目或小众库没声明文件,又不想等作者更新?可以手动建个 types/my-lib/index.d.ts,内容类似:

declare module 'my-lib' {
export function doSomething(input: string): boolean;
export const VERSION: string;
}

再在 tsconfig.jsontypeRootsincludes 里加上 types 目录,立刻生效。

声明文件不是玄学,它是连接 JS 生态和 TS 体验的一座桥。不用从头手写,也不用等别人造好轮子——几行配置、几句注释,就能让自己的代码更健壮,也让别人用得更顺手。