为npm库增加.d.ts描述文件

1、前言

对于npm项目,即使是非ts项目也可以编写.d.ts用于描述库函数。这样使用者通过描述文件能够更好的了解函数的使用方法和作者的目的。

2、设置描述文件

  • .d.ts描述文件可以放在任何地方,内容一般是:
declare module 'img-video-ascii' {
    /**
     * Converts an image to ASCII art and displays it in a specified container.
     *
     * @param {string} imageUrl - The URL of the image to convert.
     * @param {HTMLElement} container - The HTML element where the ASCII art will be displayed.
     * @param {Object} [options] - The optional parameters for rendering ASCII art.
     * @param {number} [options.fontSize=8] - The font size for ASCII characters.
     * @param {number} [options.lineHeight=14] - The line height for ASCII characters.
     */
    export function imageToAscii(
        imageUrl: string, // 图像的 URL,必须是字符串
        container: HTMLElement | null, // 用于显示 ASCII 图像的 HTML 元素
        options?: { // 可选参数,包含字体大小和行高
            fontSize?: number, // 字体大小,可选,默认为 8
            lineHeight?: number // 行高,可选,默认为 14
        }
    ): void;

    export function videoToAscii(videoUrl: string, container: HTMLElement | null): void;
}

.d.ts 文件(TypeScript 声明文件)的写法旨在为 JavaScript 代码提供类型描述,以帮助 TypeScript 进行类型检查和提示。这些文件通常用于没有用 TypeScript 编写的库,以便在 TypeScript 项目中使用时仍能享有类型安全。

  • 注释有助于描述代码的作用:
    • JSDoc 标签
    • @param 标签
    • @param {string} imageUrl: 描述 imageUrl 参数是一个字符串类型,表示要转换的图像的 URL。
    • @param {HTMLElement} container: 描述 container 参数是一个 HTMLElement 类型,它是显示 ASCII 艺术的 HTML 元素。
    • @param {Object} [options]: 说明 options 是一个可选对象参数,包含可调整的设置。[] 表示可选参数。
    • @param {number} [options.fontSize=8]: options 对象的可选属性 fontSize,类型是数字,默认值为 8。此外,它详细描述了其默认使用的值。
    • @param {number} [options.lineHeight=14]: 类似的,options 对象的可选属性 lineHeight,类型是数字,默认值为 14。
  • 设置好描述文件后需要再package.json中设置types位置:
{
  "name": "img-video-ascii",
  "version": "1.0.0",
  "description": "Img-Video-ASCII is a powerful Node.js library designed to convert images and video frames into stunning ASCII art. Whether you're looking to transform a single picture or extract frames from videos to create dynamic ASCII art sequences, this library offers a simple yet flexible API to achieve your goals.",
  "main": "index.js",
  "types": "index.d.ts", 
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

“types”: “index.d.ts”,注意这里。

具体作用

  1. 类型引用: 当开发者在 TypeScript 项目中导入这个库时,TypeScript 编译器会自动查找并使用指定的类型声明文件。这样做的目的是提供类型信息,如函数、类和对象的类型定义,从而启用类型检查和智能代码提示。
  2. IDE 支持: 集成开发环境(IDE)可以利用这些类型声明提供更好的代码补全、错误检查和导航辅助。
  3. 声明文件位置: 指定哪个 .d.ts 文件包含该模块的类型定义。这对于大型项目或库至关重要,因为多个 .d.ts 文件可能存放在不同的目录中。

3、多个描述文件

为一个 JavaScript 项目设置多个 TypeScript 类型声明文件的完整流程如下:

假设项目目录结构

假设你正在开发一个名为 my-library 的 JavaScript 库,并希望引入 TypeScript 类型支持。项目目录可能如下所示:

css复制代码my-library/
├── src/
│   ├── index.js
│   ├── moduleA.js
│   └── moduleB.js
├── types/
│   ├── index.d.ts
│   ├── moduleA.d.ts
│   └── moduleB.d.ts
└── package.json

步骤流程

  1. 创建类型声明文件:
    • types/ 文件夹内,为每个 JavaScript 模块创建相应的 .d.ts 文件。
    • 示例:在 moduleA.d.ts 中定义 moduleA.js 的类型信息。
  2. 配置主类型声明文件:
    • index.d.ts 中,汇总所有模块的类型声明。你可以使用 export 语句或者引用指令。
typescript复制代码// types/index.d.ts
export * from './moduleA';
export * from './moduleB';
  1. 修改 package.json:
    • package.json 文件中,配置 "types" 字段指向主入口类型声明文件。
json复制代码{
  "name": "my-library",
  "version": "1.0.0",
  "main": "src/index.js",
  "types": "types/index.d.ts"
}
  1. 使用三斜线指令 (可选):
    • 在每个 .d.ts 中,可以使用 /// <reference path="..." /> 语法引入其他需要的声明文件。如果类型之间相互依赖,这个方法非常有用。
    typescript复制代码// types/moduleA.d.ts /// <reference path="./moduleB.d.ts" /> export function exampleFunctionA(param: string): void;
  2. 包含声明文件:
    • 确保所有的 .d.ts 文件都包含在发布包中。通常情况下,只要它们在与源码同级目录中,npm 包会默认包含这些文件。通过 .npmignore 文件可以控制不想发布的文件/目录。
  3. 配置 tsconfig.json (针对项目使用者):
    • 如果项目使用者使用 TypeScript,他们应该在自己的项目中配置 tsconfig.json,以自动解析和使用这些声明文件。你的库正常发布后,用户需要确保 includefiles 列表中包含 node_modules/my-library 之类的路径。

发布和使用

  1. 发布你的库: 使用 npm 发包工具(如 npm publish)发布库,这些类型声明文件将被包括在内。
  2. 在 TypeScript 项目中使用: 用户在他们的 TypeScript 项目中安装并使用库时,TypeScript 编译器会自动读取 types 字段所指向的声明文件,提供类型检查和自动完成功能。

通过这个流程,你可以为 JavaScript 库成功地提供全面的 TypeScript 类型支持,提高其与 TypeScript 项目集成时的开发体验。

4、效果

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部