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

14. 声明文件(Declaration Files)

14. 声明文件Declaration Files1. 概述声明文件.d.ts文件用于描述 JavaScript 库的类型信息让 TypeScript 能够理解和使用纯 JavaScript 编写的代码。声明文件只包含类型定义不包含实现代码。┌─────────────────────────────────────────────────────────────┐ │ 声明文件系统 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 声明文件的作用 │ │ ├── 为 JavaScript 库提供类型信息 │ │ ├── 让 TypeScript 理解全局变量 │ │ ├── 扩展现有模块的类型 │ │ └── 为项目提供统一的类型定义 │ │ │ │ 声明文件来源 │ │ ├── 内置类型TypeScript 自带lib.d.ts │ │ ├── DefinitelyTypedtypes/*包 │ │ ├── 库自带库内置类型定义 │ │ └── 自定义项目内手写声明 │ │ │ │ 声明语法 │ │ ├──declarevar声明全局变量 │ │ ├──declarefunction声明函数 │ │ ├──declareclass声明类 │ │ ├──declaremodule声明模块 │ │ ├──declarenamespace声明命名空间 │ │ └──declareglobal扩展全局类型 │ │ │ └─────────────────────────────────────────────────────────────┘2. 为什么需要声明文件2.1 没有声明文件的问题// utils.js纯 JavaScriptexportfunctionformatPrice(price,currency¥){return${currency}${price.toFixed(2)};}exportconstAPI_URLhttps://api.example.com;exportclassUser{constructor(name){this.namename;}greet(){returnHello,${this.name};}}// app.tsTypeScriptimport{formatPrice,API_URL,User}from./utils.js;// TypeScript 无法推断类型所有导入都是 any 类型constpriceformatPrice(99.9);// anyconsturlAPI_URL;// anyconstusernewUser(Alice);// any2.2 添加声明文件// utils.d.tsdeclaremodule./utils.js{exportfunctionformatPrice(price:number,currency?:string):string;exportconstAPI_URL:string;exportclassUser{constructor(name:string);name:string;greet():string;}}3. 声明语法3.1 declare var / let / const// global.d.ts// 声明全局变量declarevar__VERSION__:string;declarelet__DEBUG__:boolean;declareconst__API_URL__:string;// 声明全局函数declarefunctionlog(message:string):void;// 声明全局类declareclassGlobalService{staticinstance:GlobalService;getName():string;}3.2 declare function// 声明函数重载declarefunctioncreateElement(tag:string):HTMLElement;declarefunctioncreateElement(tag:string,props:object):HTMLElement;declarefunctioncreateElement(tag:string,props:object,...children:any[]):HTMLElement;// 声明函数属性declarefunctionfetch(url:string):PromiseResponse;declarenamespacefetch{functionpolyfill():void;constisSupported:boolean;}3.3 declare class// 声明类declareclassAnimal{constructor(name:string);name:string;speak():void;staticcreate(name:string):Animal;}// 声明抽象类declareabstractclassShape{abstractgetArea():number;getPerimeter():number;}3.4 declare module// 声明外部模块declaremodulelodash{exportfunctionchunkT(array:T[],size:number):T[][];exportfunctiondebounceTextends(...args:any[])any(func:T,wait:number):T;}// 声明模块通配符declaremodule*.css{constcontent:{[className:string]:string};exportdefaultcontent;}declaremodule*.vue{importtype{DefineComponent}fromvue;constcomponent:DefineComponent{},{},any;exportdefaultcomponent;}declaremodule*.png{constsrc:string;exportdefaultsrc;}3.5 declare namespace// 声明命名空间declarenamespaceMyLib{functiondoSomething():void;namespaceUtils{functionhelper():string;}interfaceOptions{debug:boolean;timeout:number;}}// 使用MyLib.doSomething();MyLib.Utils.helper();3.6 declare global// 扩展全局类型declareglobal{interfaceWindow{myCustomProperty:string;myAPI:{getData():Promiseany;};}interfaceArrayT{last():T|undefined;first():T|undefined;}}// 使用window.myCustomPropertyvalue;constlast[1,2,3].last();// 34. DefinitelyTyped4.1 安装类型定义# 安装 Node.js 类型npminstall--save-dev types/node# 安装 React 类型npminstall--save-dev types/react# 安装 Lodash 类型npminstall--save-dev types/lodash# 安装 Express 类型npminstall--save-dev types/express4.2 使用示例// 安装后自动可用无需额外配置import*asexpressfromexpress;import*as_fromlodash;constappexpress();// 类型正确constchunked_.chunk([1,2,3,4],2);// number[][]5. 编写声明文件5.1 为 JavaScript 库编写声明// my-library.d.ts// 假设有一个 JavaScript 库 my-library// 模块声明declaremodulemy-library{// 配置接口exportinterfaceConfig{debug?:boolean;timeout?:number;retries?:number;}// 主要函数exportfunctioninit(config:Config):void;exportfunctiongetDataT(url:string):PromiseT;exportfunctionpostDataT(url:string,data:any):PromiseT;// 类exportclassClient{constructor(config:Config);requestT(url:string):PromiseT;close():void;}// 常量exportconstversion:string;exportconstAPI_BASE:string;}5.2 为全局库编写声明// global-lib.d.ts// 假设有一个全局 JavaScript 库interfaceGlobalLibConfig{mode:development|production;apiUrl:string;}interfaceGlobalLibAPI{start():void;stop():void;getConfig():GlobalLibConfig;}// 声明全局变量declarevarGlobalLib:GlobalLibAPI;declarefunctioninitGlobalLib(config:GlobalLibConfig):void;5.3 扩展现有模块// express-extensions.d.tsimportexpress;declaremoduleexpress{interfaceRequest{user?:{id:number;name:string;role:admin|user;};startTime:number;}interfaceResponse{successT(data:T):this;error(message:string,code?:number):this;}}6. 声明文件的类型导出6.1 导出类型// types/index.d.tsexportinterfaceUser{id:number;name:string;email:string;}exporttypeUserRoleadmin|user|guest;exportconstdefaultUser:User;exportfunctioncreateUser(name:string,email:string):User;6.2 默认导出// logger.d.tsdeclareclassLogger{constructor(name:string);info(message:string):void;error(message:string):void;warn(message:string):void;}exportdefaultLogger;6.3 混合导出// utils.d.tsexportconstversion:string;exportfunctionformatDate(date:Date):string;exportfunctionformatNumber(num:number):string;exportdefault{version,formatDate,formatNumber};7. 完整示例为 API 客户端编写声明// api-client.js假设是已有的 JavaScript 代码// 1. 声明文件 // api-client.d.tsdeclaremoduleapi-client{// 请求配置exportinterfaceRequestConfig{method?:GET|POST|PUT|DELETE;headers?:Recordstring,string;timeout?:number;retries?:number;}// 响应类型exportinterfaceApiResponseTany{success:boolean;data:T;message:string;code:number;timestamp:number;}// 错误类型exportinterfaceApiError{code:number;message:string;details?:any;}// 拦截器exportinterfaceInterceptor{request?:(config:RequestConfig)RequestConfig;response?:T(response:ApiResponseT)ApiResponseT;error?:(error:ApiError)void;}// 客户端类exportclassApiClient{constructor(baseURL:string,config?:RequestConfig);getT(url:string,config?:RequestConfig):PromiseApiResponseT;postT(url:string,data?:any,config?:RequestConfig):PromiseApiResponseT;putT(url:string,data?:any,config?:RequestConfig):PromiseApiResponseT;deleteT(url:string,config?:RequestConfig):PromiseApiResponseT;addInterceptor(interceptor:Interceptor):void;removeInterceptor(interceptor:Interceptor):void;setToken(token:string):void;clearToken():void;}// 工厂函数exportfunctioncreateClient(baseURL:string,config?:RequestConfig):ApiClient;// 默认导出exportdefaultApiClient;}// 2. 使用示例 // app.tsimportApiClient,{createClient,ApiResponse}fromapi-client;interfaceUser{id:number;name:string;email:string;}// 方式1使用类constclientnewApiClient(https://api.example.com,{timeout:5000,retries:3});client.setToken(your-token);constresponseawaitclient.getUser[](/users);if(response.success){console.log(response.data);// User[]}// 方式2使用工厂函数constclient2createClient(https://api.example.com);// 添加拦截器client2.addInterceptor({request:(config){console.log(Request:,config);returnconfig;},response:(res){console.log(Response:,res);returnres;}});8. 发布类型定义8.1 package.json 配置{name:my-library,version:1.0.0,main:dist/index.js,types:dist/index.d.ts,files:[dist/**/*.js,dist/**/*.d.ts],scripts:{build:tsc,prepublishOnly:npm run build}}8.2 双包发布{name:my-library,version:1.0.0,main:dist/index.js,module:dist/index.mjs,types:dist/index.d.ts,exports:{.:{import:./dist/index.mjs,require:./dist/index.js,types:./dist/index.d.ts},./utils:{import:./dist/utils.mjs,require:./dist/utils.js,types:./dist/utils.d.ts}}}9. 常见模式9.1 条件类型导出declaremodulemy-utils{exportfunctionisString(value:unknown):valueisstring;exportfunctionisNumber(value:unknown):valueisnumber;exportfunctionisArrayT(value:unknown):valueisT[];}9.2 泛型类型导出declaremodulemy-utils{exportfunctionmapT,U(array:T[],fn:(item:T,index:number)U):U[];exportfunctionfilterT(array:T[],predicate:(item:T)boolean):T[];exportfunctionreduceT,U(array:T[],reducer:(acc:U,item:T)U,initialValue:U):U;}9.3 可调用接口declaremodulemy-utils{interfaceMyFunction{(value:string):number;version:string;config:{debug:boolean};}constmyFunction:MyFunction;exportdefaultmyFunction;}10. 总结声明类型语法用途变量declare var name: type声明全局变量函数declare function name(params): return声明全局函数类declare class Name { ... }声明全局类模块declare module name { ... }声明外部模块命名空间declare namespace Name { ... }声明命名空间全局扩展declare global { ... }扩展全局类型通配符declare module *.ext声明文件模块

相关文章:

14. 声明文件(Declaration Files)

14. 声明文件(Declaration Files) 1. 概述 声明文件(.d.ts 文件)用于描述 JavaScript 库的类型信息,让 TypeScript 能够理解和使用纯 JavaScript 编写的代码。声明文件只包含类型定义,不包含实现代码。 ┌─…...

远程会议还在发文档改来改去?我用 Rustpad 搭了个协作平台彻底解决

前言 远程会议开到一半,需要共同修订一份文档或代码提纲,这种场景估计不少人经历过。方案来来去去就那几个:发邮件等反馈、微信来回传文件、用腾讯文档但要登录账号……每种都有各自的鸡肋之处。后来我自己琢磨出一套更顺手的方案&#xff1…...

专业级图片去重神器:彻底告别重复照片的数字困扰

专业级图片去重神器:彻底告别重复照片的数字困扰 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾经花费数小时手动整理电脑中堆积如山的重复照片&a…...

【软考高级架构】论文预测——论基于ATAM的架构评估方法

论基于ATAM的架构评估方法 摘要 软件架构评估是保障系统质量属性满足业务目标的关键环节。架构权衡分析方法(Architecture Trade-off Analysis Method,ATAM)作为一种系统化的架构评估方法,通过场景捕获、质量属性分析、敏感点与权衡点识别、风险与非风险决策分类等结构化…...

干货合集:2026最新AI论文软件测评与推荐大全

2026年真正好用的AI论文软件,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...

2026企业网盘选型对比:坚果云领衔,5款主流产品优劣与场景建议

随着企业数字化办公不断加深,企业网盘已从“文件存储工具”演变为“组织级协作平台”。到2026年,各厂商在同步机制、协作效率、权限体系与安全合规方面差距进一步拉大。本文对5款主流企业网盘做横向对比,帮助管理者按业务场景选到更合适的方案…...

2026年AI面试助手深度测评:鹅来面 OfferGoose如何革新你的求职体验?

随着2026年求职市场的白热化,传统的“海投简历 裸面”模式已难以为继。无论是职场老将寻求突破,还是应届生初入职场,面对日益复杂的JD要求和瞬息万变的面试场景,一个高效的求职“第二大脑”变得至关重要。过去,求职者…...

受够了网盘限速?2026年更顺手的不限速同步盘选择

受够了网盘限速、下载慢、传大文件卡顿?如果你的核心诉求是“上传下载不被限速、同步稳定、多人协作更省心”,下面这4款网盘可以作为备选参考。本文以“传输体验 同步效率 安全合规 协作能力”做客观对比,方便你按需选择。 先看对比表&am…...

图解人工智能(31)深度学习前沿

在词向量模型中,训练的目的是使相关的词离的更近,不相关的词离的更远,其中“相关性”是按语义上的远近来判断的。假设我们要对下列领域中的对象做嵌入,该如何定义对象的相关性?(1)动物园里的动物…...

带标注的螺丝、螺栓、垫圈缺陷识别数据集,包含缺陷里包含生锈和划痕,1291张图,支持yolo,coco json,voc xml,文末有模型训练代码。

​ 带标注的螺丝、螺栓、垫圈缺陷识别数据集,包含缺陷里包含生锈和划痕,1291张图,支持yolo,coco json,voc xml,文末有模型训练代码。 数据集拆分 总图数:1291 张图数 训练集 1143 张图 验证集 106 张图…...

边缘AI框架:在边缘设备上运行AI模型

边缘AI框架:在边缘设备上运行AI模型 一、边缘AI框架概述 1.1 边缘AI框架的定义 边缘AI框架是指用于在边缘设备上部署和运行AI模型的软件框架。它提供了模型优化、推理加速和设备适配等功能,使得AI模型能够在资源受限的边缘设备上高效运行。 1.2 边缘AI框…...

自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究)

自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究) 作者:方见华 单位:世毫九实验室 摘要 本研究提出了一个关于"自指系统与算术障碍的跨领域猜想"的理论框…...

单智能体 vs 多智能体系统:架构对比与选择

单智能体 vs 多智能体系统:架构对比与选择 1. 标题 (Title) 单智能体 vs 多智能体系统:架构对比与选择指南 从单体到群体:智能体系统架构的深度解析与选型策略 智能体系统设计:何时选择单智能体,何时拥抱多智能体? 单一智慧 vs 群体智能:智能体系统架构对比与实践指南 …...

雷达信号体制识别

雷达信号体制识别 摘要 本文档基于工程中的信号识别流水线入口脚本及其所依赖的核心模块,系统梳理该工程如何实现雷达脉冲信号的体制分类(Signal Type Recognition)。该流水线采用“脉冲检测 → 脉冲描述字提取 → 脉内特征分析 → 驻留段分段…...

【限时解密】ElevenLabs未开放的客家话语音fine-tuning沙箱环境:如何用不到200条标注语句,在72小时内将模型MOS分从3.1提升至4.4(附私有化微调checklist)

更多请点击: https://codechina.net 第一章:【限时解密】ElevenLabs未开放的客家话语音fine-tuning沙箱环境:如何用不到200条标注语句,在72小时内将模型MOS分从3.1提升至4.4(附私有化微调checklist) Eleve…...

毕业设计 深度学习车道线检测(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断…...

手写一个AI代码审查员:Claude Agent SDK + MCP 深度实战

引言2026年5月,Anthropic做了一件意味深长的事:把 Claude Code SDK 改名为 Claude Agent SDK。改名背后是一个判断——这不再是"帮你写代码的工具",而是一个能自主读代码、分析逻辑、修改文件、跑测试、甚至提PR的AI Agent编排框架…...

为什么你的ElevenLabs四川话输出总像“普通话+口音”?3步声学特征解耦法让韵律自然度提升2.8倍(附Python声谱可视化代码)

更多请点击: https://intelliparadigm.com 第一章:为什么你的ElevenLabs四川话输出总像“普通话口音”? ElevenLabs 当前并未提供原生四川话(西南官话成渝片)语音模型,其所谓“方言支持”实为在标准普通话…...

GitHub史诗级泄露:3800个核心仓库被窃,TeamPCP如何通过VS Code扩展攻破全球最大代码平台

一、引言:全球开发者的至暗时刻 2026年5月20日,一则消息震惊了整个科技界:微软旗下全球最大代码托管平台GitHub确认,约3800个内部私有仓库被威胁组织TeamPCP窃取,涵盖GitHub Copilot、CodeQL、GitHub Actions、Codespa…...

使用Taotoken后Keil5项目代码审查效率的直观提升

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后Keil5项目代码审查效率的直观提升 1. 背景与需求 在嵌入式开发领域,代码审查是保证软件质量的关键环节…...

一文讲透|盘点2026年标杆级的AI论文网站

一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的AI论文网站神器,覆盖全流程生成、文献处理、降重润色、格式排版四大核心场景,帮你高效搞定毕业论文。 一、全流程王者:一站式搞定论文全链路(一天…...

Godot 4.3+生产级3D反向运动学(IK)系统实战指南

1. 这不是“加个插件就动起来”的玩具,而是能进生产管线的IK系统 在Godot社区里,“反向运动学”这个词被提得太多,也太轻了。我见过太多人把 Skeleton3D 拖进场景,点开 IK 节点属性,勾上“启用”,然后…...

终极指南:免费开源的AMD Ryzen调试神器SMUDebugTool完整使用教程

终极指南:免费开源的AMD Ryzen调试神器SMUDebugTool完整使用教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...

PostHog完整指南:5分钟搭建开源产品分析平台,免费监控用户行为

PostHog完整指南:5分钟搭建开源产品分析平台,免费监控用户行为 【免费下载链接】posthog.com Official docs, website, and handbook for PostHog. 项目地址: https://gitcode.com/GitHub_Trending/po/posthog.com PostHog是一款功能强大的开源产…...

Minecraft性能监控终极指南:如何用Spark快速诊断服务器卡顿

Minecraft性能监控终极指南:如何用Spark快速诊断服务器卡顿 【免费下载链接】spark A performance profiler for Minecraft clients, servers, and proxies. 项目地址: https://gitcode.com/gh_mirrors/spark6/spark Minecraft服务器性能优化一直是管理员面临…...

终极QR码修复指南:如何用QrazyBox免费恢复损坏的二维码

终极QR码修复指南:如何用QrazyBox免费恢复损坏的二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾遇到过重要的二维码因为打印模糊、水渍污染或物理磨损而无法扫描&a…...

如何在5分钟内掌握DistroAV网络视频传输:新手完整指南

如何在5分钟内掌握DistroAV网络视频传输:新手完整指南 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 还在为复杂的直播布线烦恼吗?想要在不同设备…...

GanttProject终极指南:免费开源的项目管理工具完全攻略

GanttProject终极指南:免费开源的项目管理工具完全攻略 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款功能强大的免费开源项目管理软件,通过直…...

OBS智能背景移除插件:零绿幕实现专业直播效果的完整指南

OBS智能背景移除插件:零绿幕实现专业直播效果的完整指南 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https:…...

GBase 8a之listagg/string_agg 函数的反函数实现

GBase8a数据库中 listagg/string_agg 函数的反函数实现一、业务场景背景 在日常数据开发中,我们经常会遇到这种场景:某张表的字段里存储了用逗号(或其他分隔符)拼接的多个值,比如商品分类、标签、关联系统名称等&#…...