你在用某个 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.ts 和 format.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.json 的 typeRoots 或 includes 里加上 types 目录,立刻生效。
声明文件不是玄学,它是连接 JS 生态和 TS 体验的一座桥。不用从头手写,也不用等别人造好轮子——几行配置、几句注释,就能让自己的代码更健壮,也让别人用得更顺手。