当前位置: 首页 > news >正文

阮一峰《TypeScript 教程》学习笔记——d.ts 类型声明文件

1. 一段话总结

d.ts类型声明文件是TypeScript中仅包含纯类型描述(无具体代码实现) 的文件,核心作用是定义模块外部接口类型,避免引用外部类型(如第三方库、全局对象)时的编译报错;其来源主要有三种——编译器自动生成(开启declaration编译选项)、TypeScript内置声明文件(如lib.d.ts/lib.dom.d.ts)、外部类型声明文件(第三方库自带或社区@types命名空间下的库);文件中常用declare关键字描述外部类型(变量、函数、类等),支持通过三斜杠命令path/types/lib)加载依赖的类型文件;模块发布时需在package.json配置types/typings字段,指明声明文件的位置,确保使用者能正确识别类型。


2. 思维导图

在这里插入图片描述


3. 详细总结

一、d.ts类型声明文件简介

  1. 核心定义
    后缀为.d.ts的文件,仅包含纯类型描述(如接口、函数类型、变量类型),无任何具体代码实现(如函数体、类方法逻辑),编译时不生成JS代码,仅用于TypeScript类型检查。
  2. 核心用途
    定义模块的外部接口类型,解决“引用外部类型(第三方库、全局对象)时编译器无法识别类型”的问题,同时帮助开发者明确模块接口。
  3. 基础示例
    若某模块导出getArrayLength函数,其module.d.ts文件如下:
    export function getArrayLength(arr: any[]): number; // 仅类型描述
    export const maxInterval: 12; // 常量类型
    

二、类型声明文件的来源(三种核心途径)

来源类型获取方式关键特性示例
自动生成开启TypeScript编译选项**declaration: true**(tsconfig.json)或命令行tsc --declaration从.ts文件自动提取类型,生成同名.d.ts文件,无需手动编写编译index.ts生成index.d.ts
内置声明文件TypeScript安装时自带,位于安装目录的lib文件夹描述JavaScript原生API(如ES标准、DOM),编译器按target自动加载,可通过lib选项指定lib.d.ts(基础类型)、lib.dom.d.ts(DOM类型)
外部类型声明文件1. 第三方库自带(如moment库的moment.d.ts);
2. 社区提供(@types命名空间,npm安装);
3. 自定义(无现成声明时)
1. 自带声明文件需配置路径;
2. 社区库集中在@types,如@types/jquery
3. 自定义可用declare设为any
安装@types/jquery、自定义declare module 'unknown-lib'
  • 关键配置:
    • 指定内置库:tsconfig.json的lib选项(如"lib": ["dom", "es2021"]);
    • 自定义外部库路径:typeRoots选项(如"typeRoots": ["./typings"]),指定加载类型库的目录;
    • 仅加载特定外部库:types选项(如"types": ["jquery"])。

三、declare关键字在d.ts中的用法

d.ts文件中主要用declare描述外部已存在的类型,避免重复定义或涉及值代码:

  1. 变量/函数/类:必须用declare(因涉及值描述,d.ts不允许值代码):
    declare let x: number; // 正确:描述外部变量x
    declare function sayHello(name: string): void; // 正确:描述外部函数
    declare class Animal { constructor(name: string); } // 正确:描述外部类
    
  2. 接口/类型别名:可省略declare(因接口是纯类型代码):
    interface Foo {} // 正确
    declare interface Foo {} // 正确(效果一致)
    type Bar = string | number; // 正确
    
  3. 模块/命名空间:描述外部模块或命名空间的类型:
    declare module 'moment' { // 描述moment库的类型function moment(): any;export default moment;
    }
    declare namespace D3 { // 描述D3库的命名空间类型export interface Event { x: number; y: number; }
    }
    

四、模块发布时的d.ts配置

当模块包含自定义d.ts文件时,需在package.json中配置,确保使用者能找到声明文件:

  1. 核心字段
    • typestypings字段:指明d.ts文件的路径(二选一,types更常用);
      {"name": "my-module","main": "./lib/main.js","types": "./lib/main.d.ts" // 指明类型声明文件位置
      }
      
  2. 例外情况
    若d.ts文件名为index.d.ts且位于项目根目录,无需配置types字段,TypeScript会自动识别。
  3. 依赖外部类型库
    若模块依赖第三方类型库(如@types/browserify),需在dependenciesdevDependencies中添加该库,确保使用者安装时一并获取。

五、三斜杠命令(加载依赖的类型文件)

三斜杠命令(///)是TypeScript编译器命令,仅用于文件头部,用于加载依赖的类型文件,分三种类型:

命令格式核心作用适用场景示例
/// 加载本地依赖文件(相对/绝对路径)加载自定义拆分的d.ts文件或本地类型文件/// <reference path="./interfaces.d.ts" />
/// 加载@types目录下的社区类型库仅在d.ts文件中使用,依赖第三方@types/// <reference types="node" />(加载@types/node)
/// 加载TypeScript内置lib库显式加载特定内置API类型(如ES2017字符串API)/// <reference lib="es2017.string" />
  • 注意事项:
    • 命令必须位于文件头部,前面仅允许注释和其他三斜杠命令;
    • 开启noResolve编译选项时,三斜杠命令会被视为普通注释,不生效;
    • 若需合并编译产物,需配合outFile选项(仅支持None/System/AMD模块格式)。

4. 关键问题

问题1:d.ts类型声明文件与普通.ts文件的核心差异是什么?为什么d.ts文件中不允许包含具体代码实现?

答案
核心差异体现在“内容性质”和“编译产物”两方面:

  1. 内容性质:d.ts文件仅包含纯类型描述(如接口、declare声明),无任何具体代码实现(如函数体、类方法逻辑);普通.ts文件可同时包含类型描述和代码实现;
  2. 编译产物:d.ts文件的所有内容不进入最终编译产物(仅用于编译时类型检查);普通.ts文件的代码实现会被编译为JS代码,类型描述会被剥离。

d.ts不允许包含具体代码实现的原因:其设计目标是“仅定义外部接口类型”,若包含实现,会导致类型声明与业务逻辑耦合,违背“纯类型声明”的定位,且可能与外部模块的实际实现冲突,失去类型声明的通用性。

问题2:当项目使用某第三方库(如jQuery)且该库无自带类型声明文件时,如何获取并正确配置对应的d.ts文件?

答案
可通过“社区类型库”或“自定义声明”两种方式获取,具体步骤如下:

  1. 优先获取社区类型库(推荐):

    • 社区类型库集中在npm的@types命名空间下,jQuery的类型库为@types/jquery
    • 安装命令:npm install @types/jquery --save-dev(开发依赖,因仅编译时用);
    • 自动识别:TypeScript默认加载node_modules/@types目录下的类型库,无需额外配置,直接使用$即可通过类型检查。
  2. 无社区库时自定义声明

    • 新建自定义d.ts文件(如jquery.d.ts),用declare关键字描述jQuery的核心类型:
      declare var $: any; // 简单声明$为any类型(快速兼容,无精确类型检查)
      // 或精确声明(推荐):
      declare namespace jQuery {interface JQuery {html(content: string): JQuery;click(handler: () => void): JQuery;}
      }
      declare var $: jQuery.JQuery;
      
    • 配置加载:在tsconfig.json的files字段添加该文件路径(如"files": ["./jquery.d.ts"]),确保编译器识别。

问题3:三斜杠命令的pathtypeslib参数分别适用于什么场景?三者在加载目标和使用限制上有何核心区别?

答案
三者的适用场景、加载目标及限制差异如下:

参数适用场景加载目标使用限制
path加载本地自定义的d.ts文件或依赖脚本本地文件(相对/绝对路径,如./interfaces.d.ts1. 路径必须指向存在的文件;
2. 不允许指向当前文件;
3. 开启noResolve时失效
types加载@types目录下的社区类型库社区类型库名称(如node对应@types/node1. 仅在d.ts文件中使用,普通.ts文件需用tsconfig.json的types选项;
2. 依赖typeRoots配置的目录
lib显式加载TypeScript内置的lib库(API类型)内置lib库的描述符(如es2017.string对应lib.es2017.string.d.ts1. 加载目标仅为TypeScript内置库;
2. 等效于tsconfig.json的lib选项

核心区别:

  • path面向“本地自定义文件”,types面向“社区类型库”,lib面向“内置API库”;
  • typeslib仅加载预设类型库,path加载自定义文件,灵活性更高但需手动管理路径。
http://www.dtcms.com/a/532073.html

相关文章:

  • Spring AOP:横切关注点的优雅解决方案
  • 如何申请网站空间和注册域名鞋子软文推广300字
  • 基于AutoDL远端服务器在pycharm复现:具身智能论文pai0
  • 如何看访问网站的dns网站开发难不难
  • 数据结构·堆
  • 阮一峰《TypeScript 教程》学习笔记——类型映射
  • 需要做网站建设和推广网站地图插件
  • PyCharm 设置 Tabs and Indents
  • Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
  • 【SpringBoot】详解Maven的操作与配置
  • 【C++】STL容器--priority_queue的使用与模拟实现
  • 【系统分析师】高分论文:论需求分析方法及应用(电子商务门户网站系统)
  • 【大模型应用开发 6.LangChain多任务应用开发】
  • 泰安最好的网站建设公司怎么通过做网站赚钱吗
  • 初识C语言15.文件操作
  • 聊聊连续、递增
  • 9款上班打卡软件测评:帮你选出最适合企业的工具
  • 建站服务网络公司建设宣传网站上的请示
  • Mem0 使用案例学习总结 - 记忆化应用结构
  • 如何自动清理 Linux 临时文件 ?
  • C++容器forward_list
  • 茂名网站建设培训品牌宣传网站
  • 油漆工找活做的网站网站免费建设
  • TcpClinet
  • Appium+Python+Android+Nodejs环境安装
  • SCDN:互联网时代网站安全的安全保障
  • Linux小课堂: Apache服务在CentOS上的安装与基础配置指南
  • Gorm(八)预加载方式
  • 网站开发与设计的实训场地WordPress无法自动推送
  • 【找指针数组最大值】2022-11-24