TS:.d.ts 文件 和 declare 的作用
- 1 declare 做外部声明
- 1.1 声明外部类型
- 1.2 声明外部模块
- 1.2.1 解决引入资源模块报错
- 1.2.2 跳过对第三方库的类型检查
- 1.3 声明外部变量
- 1.4 声明外部命名空间(作用域)
- 2 .d.ts 文件做外部声明
- 3 declare global {} 在模块中做外部声明
先说一下我对 .d.ts文件 和 declare 的理解,.d.ts文件 和 declare 都是用来做 外部声明 的,而 .d.ts 文件做外部声明是 declare 做外部声明的简化形式。
备注:
我理解 外部声明 就是 声明全局类型或者模块,可以直接引用而不用去 import 或者 import type 相应的变量或者类型。
1 declare 做外部声明
如果 types.ts 文件在 ts 编译范围内的情况下,在 types.ts 文件中,通过 declare 声明的变量、类型或者模块是全局性的,即,可以在不导入类型的情况下直接使用。
1. 何为 types.ts 文件在 ts 编译范围内的情况下?
在 TS 配置文件(tsconfig.js)中,通过 include 选项设置的编译范围内包含 types.ts 文件。
2. 用 declarre 声明的变量、类型或者模块不能全局使用的情况?
types.ts 文件不能是模块,即,文件内不用有导入/导出语句(import,import type,export,export type)。如果文件中包含导入导出语句,types.ts 文件中的声明将失去全局性,必须导出声明,并在使用时先导入,否则会报错。
1.1 声明外部类型
// ajax 请求方式
declare type AjaxType = 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH';
1.2 声明外部模块
1.2.1 解决引入资源模块报错
declare module '*.css';
declare module '*.scss';
declare module '*.png';
此例中,不对导入的资源模块进行类型检查。如果不进行以上声明,导入 css/less/png 等资源文件时会提示编译错误。
1.2.2 跳过对第三方库的类型检查
declare module 'jquery';
如果想要使用一些用js 编写的第三方库,可以通过声明外部模块,跳过对第三方库的类型检查
此例中,jquery模块中所有成员的类型都成了any类型,这等同于不对jQuery进行类型检查。
1.3 声明外部变量
declare var a: boolean;
declare let b: boolean;
declare const c: boolean;
如果外部变量声明中没有使用类型注解,那么变量的类型为 any类型。
这个什么情况下会用到呢?假如我在项目中引入了一个sdk,这个sdk(我们以微信的sdk为例)里面有一些全局的对象(比如wx),但是如果不经过任何的声明,在ts文件里面直接用wx.config()的话,肯定会报错。
declare就是告诉 TS编译器 你担保这些变量和模块存在,并声明了相应类型,编译的时候按照声明的类型进行类型检查,如果没有声明类型,默认是 any 类型。
1.4 声明外部命名空间(作用域)
declare namespace API {var a: boolean;let b: boolean;const c: boolean;function foo(bar: string, baz: boolean): void;
}
外部命名空间的成员默认为导出成员,不需要使用export关键字来明确地导出它们,但使用了export关键字也没有错误。
声明完之后在其他 ts文件中,就可以直接 API.xxx 引用。
2 .d.ts 文件做外部声明
和 declare 做外部声明一样, .d.ts 文件(例如:types.d.ts)在 ts 编译范围内,且 .d.ts 文件不是模块的情况下,文件中声明的变量、类型或者模块都是外部声明。只不过在 .d.ts 文件中的声明可以省略 declare。
// types.d.ts文件中
type PlainObjectType<T = any> = { [propType: string]: T };
// declare type PlainObjectType<T = any> = { [propType: string]: T };
以上两种声明,都是外部声明,效果相同。
注意:
1. .d.ts 文件提供的声明仅在编译阶段有效
.d.ts 文件中只提供类型声明,不提供任何值,如字符串和函数实现等,在编译TypeScript程序的过程中,.d.ts文件 不会生成对应的 .js文件。
2. .d.ts 文件不能是模块
.d.ts 文件不能是模块,即,文件内不用有导入/导出语句(import,import type,export,export type)。如果文件中包含导入导出语句,.d.ts 文件中的声明将失去全局性,必须导出声明,并在使用时先导入,否则会报错。
3 declare global {} 在模块中做外部声明
使用 declare global {} 可以实现在模块中做外部声明。以下示例中:
MainMenuType 类型 就是外部接口类型,在其他模块中不用引入就可以直接使用。
UserType 类型 在其他模块中需要引入才能使用。
import { createSlice } from '@reduxjs/toolkit';
import type { PayloadAction } from '@reduxjs/toolkit';declare global {interface MainMenuType {eventCode: string,businessCode: string,menuOrder: number,icon: string,menuId: string,menuPid: string,isMultiple: boolean,menuName: string,menuType: string,menuGroup: string,menuAttestWay: string,children?: MainMenuType[]}
}export interface UserType {common: PlainObjectType,mainMenus: MainMenuType[],[key: string]: any
}
相关文章:
TS:.d.ts 文件 和 declare 的作用
1 declare 做外部声明1.1 声明外部类型1.2 声明外部模块1.2.1 解决引入资源模块报错1.2.2 跳过对第三方库的类型检查 1.3 声明外部变量1.4 声明外部命名空间(作用域) 2 .d.ts 文件做外部声明3 declare global {} 在模块中做外部声明 先说一下我对 .d.ts文…...
JavaScript-jQuery2-笔记
1.获取元素文本、属性、内部结构、表单中的值 获取标签中所夹的文本内容:text() 获取标签的属性值:prop(属性名) 获取表单元素的内容:如 文本框中的内容 val() 获取元素的内部html结构:html() 2.筛选选择器 筛选选择器࿱…...
设计模式之多线程版本的if------Balking模式
系列文章目录 设计模式之避免共享的设计模式Immutability(不变性)模式 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…...
mybatis核心配置文件介绍
mybatis核心配置文件 1. properties配置介绍 properties标签:加载外部的资源配置文件 属性:resource 指定要引入的配置文件路径 在核心配置文件中,通过:${key}方式引入外部配置文件的数据 jdbc.peroperties 的文件内容…...
Linux完全卸载Anaconda3和MiniConda3
如何安装Anaconda3和MiniConda3请看这篇文章: 安装Anaconda3和MiniConda3_minianaconda3-CSDN博客文章浏览阅读474次。MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&…...
Apache Answer,最好的开源问答系统
Apache Answer是一款适合任何团队的问答平台软件。无论是社区论坛、帮助中心还是知识管理平台,你可以永远信赖 Answer。 目前该项目在github超过10K星,系统采用go语言开发,安装配置简单,界面清洁易用,且开源免费。项目…...
【C】内存分配
首先,回顾一下内存分配。所有程序都必须预留足够的内存来存储程序使用的数据。这些内存中有些是自动分配的: float x; int place[100]; 这些声明预留了足够的空间,还为内存提供了一个标识符,可以使用x或place识别数据。 1、mal…...
MySQL 从零开始:03 基本入门语句
文章目录 1、连接数据库1.1 命令提示符登陆1.2 MySQL 8.0 Command Line Client 登陆1.3 MySQL Workbench 登陆 2、基本语句2.1 查看所有库2.2 创建库2.3 删除库2.4 选择数据库2.5 查看表2.6 创建表2.7 删除表2.8 改表名2.9 清空表 在上一小节中介绍了 MySQL 数据库的安装&#…...
井盖异动传感器,守护脚下安全
随着城市化进程的加速,城市基础设施的安全问题日益受到关注。其中,井盖作为城市地下管道的重要入口,其安全问题不容忽视。然而,传统的井盖监控方式往往存在盲区,无法及时发现井盖的异常移动。为此,我们推出…...
复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式
随着汽车制造业的快速发展,对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备,以其独特的优势在汽车制造中发挥着越来越重要的作用。因此,富唯智能顺应时代的发展趋势,研发出了ICR系列的复合机器…...
重置 Docker 中 Gitlab 的账号密码
1、首先进入Docker容器 docker exec -it gitlab bash 2、连接到 gitlab 的数据库 需要谨慎操作 gitlab-rails console -e production 等待加载完后会进入控制台 ------------------------------------------------------------------------------------------------------…...
任务类型划分
以下内容来自于ChatGPT内存密集型应用和IO密集型应用是两种不同类型的计算应用,它们在资源需求和性能特点上有所不同。 内存密集型应用(Memory-Intensive Applications): 特点: 这类应用主要依赖大量的内存资源来执行任…...
docker搭建部署mysql并挂载指定目录
Docker是一种轻量级、可移植的容器化平台,可以简化应用程序的部署和管理。在本文中,我们将探讨如何使用Docker来搭建和部署MySQL数据库,并将数据和配置文件挂载到外部目录,以实现数据持久化和方便的配置管理。 1: 安装Docker 首…...
即将推出的 OpenWrt One/AP-24.XY:OpenWrt 和 Banana Pi 合作路由器板
OpenWrt开发人员正在与Banana Pi合作开发OpenWrt One/AP-24.XY路由器板。OpenWrt 是一个轻量级嵌入式 Linux 操作系统,支持近 1,800 个路由器和其他设备。然而,这将是第一块由 OpenWrt 直接开发的路由器板。 该主板将基于 MediaTek MT7981B (Filogic 82…...
【uniapp-小程序-分享图5/4】
utils.js //裁剪分享的图片为5:4 const makeCanvas (imgUrl) > {console.log("imgUrl",imgUrl);return new Promise((resolve, reject) > {// 获取图片信息,小程序下获取网络图片信息需先配置download域名白名单才能生效uni.getImageInfo({src: imgUrl,succe…...
【响应式编程】前置知识和相关技术的总结
前置知识 这些概念都与响应式编程密切相关。🦌 1. 并发和多线程编程:响应式编程需要处理并发性,它允许多个操作独立地并行执行。这使得应用程序可以在不同的线程、进程或设备上处理多个事件。 2. 事件驱动编程:响应式编程是一种…...
K8S--安装MySQL8(单机)
原文网址:K8S--安装MySQL8(单机)-CSDN博客 简介 本文介绍K8S部署MySQL8(单机)的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题…...
CMake+QT+大漠插件的桌面应用开发
文章目录 CMakeQT大漠插件的桌面应用开发说明环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发 说明 在CMake大漠插件的应用开发——处理dm.dll,免注册调用大漠插件中已经说明了如何免注册调用大漠插件,以及做了几个简单的功能调用&#x…...
OpenCV-24双边滤波
一、概念 双边滤波对于图像的边缘信息能够更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。 空间距离:指的是当前点与中心点的欧式距离。空间域的高斯函数及其数学形式为: 其中(xi,yi&…...
AI智能分析网关V4:太阳能+4G智慧水库远程可视化智能监管方案
一、背景需求分析 由于水库位置分散的原因,水库视频监控建设在立杆、布线等方面都存在一定的难度,且需要人力、物力的前期投入和后期维护。目前水库的监管存在一定的问题,管理人员工作强度大但管理质量并不高,人为巡检无法实时发…...
Spigot服务器搭建后,别忘了做这5件事:优化、备份、插件与安全基础设置
Spigot服务器搭建后必做的5项关键优化与安全设置 当你第一次看到Spigot服务器成功启动时,那种成就感确实令人兴奋。但很快你会发现,一个能运行的基础服务器和真正稳定、高效、安全的游戏环境之间,还有不小的距离。很多新手服主在这个阶段容易…...
瑞萨RA6E2评估板Keil MDK5开发全攻略:从RA Smart Configurator到烧录调试
瑞萨RA6E2评估板Keil MDK5开发全流程实战指南 对于嵌入式开发者而言,瑞萨RA6E2系列MCU凭借其高性能和丰富外设正成为工业控制、物联网终端设备的优选方案。而Keil MDK5作为Arm生态中最成熟的开发环境之一,与瑞萨官方工具链的深度整合为开发者提供了高效…...
2026 年智慧工地排名榜单第一|山东建安物联科技有限公司
2026 年度智慧工地综合实力榜单正式揭晓,山东建安物联科技有限公司(大建安)凭借标准引领、技术实力与标杆项目,登顶全国榜首,成为行业公认的智慧工地领军企业。公司打造的中建八局烟台崆峒胜境项目,获评国家…...
生成式AI欺诈来袭,什么样的IP数据接口才能筑起防线?
某电商平台的风控系统发出预警:一个“新用户”正在批量下单高价商品,收货地址遍布全国,支付方式各不相同。但奇怪的是,这些订单的浏览行为、停留时间、点击轨迹几乎完全一致——这不是真人,而是生成式AI模拟的虚假用户…...
ESP32-C3开发环境搭建(VSCode+ESP-IDF)与串口占用疑难排查实战
1. ESP32-C3开发环境搭建全攻略 第一次接触ESP32-C3开发板时,我和大多数开发者一样,被环境搭建这个"入门杀"折腾得够呛。特别是使用合宙经典款开发板时,USB转串口芯片带来的各种"惊喜"让人措手不及。这里分享一套经过实战…...
别再死记硬背了!用Treap(树堆)搞定LeetCode平衡树难题,附C++完整模板
Treap实战指南:用随机化平衡树高效解决LeetCode难题 1. 为什么选择Treap而非传统平衡树? 在算法竞赛和面试场景中,我们经常需要处理动态有序集合的操作。传统平衡树如AVL和红黑树虽然能保证严格的平衡性,但它们的实现复杂度往往让…...
别光重启!Ping域名失败但nslookup能通?一个注册表键值引发的血案(附排查脚本)
当Ping域名失败但nslookup正常:深入解析Windows注册表键值缺失的连锁反应 那天凌晨三点,运维工程师李明在机房盯着屏幕,额头渗出细密的汗珠。客户的核心业务系统刚刚完成迁移,却在最后验收阶段出现诡异现象——所有服务器都能通过…...
免费解锁付费内容:Bypass Paywalls Clean Chrome扩展终极指南
免费解锁付费内容:Bypass Paywalls Clean Chrome扩展终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字阅读时代,你是否经常遇到想阅读的文章被付…...
注CO2驱替煤层气THM耦合模型与自定义PDE耦合固体力学
注co2驱替煤层气THM耦合模型 自定义pde耦合固体力学今天,我来分享一下关于CO2驱替煤层气的THM(热-水-力学)耦合模型的构建过程。这个模型听起来有点复杂,但其实拆开来理解,每一步都还挺有意思的。尤其是其中涉及的自定…...
智鼎在线测评通关秘籍:2024最新51job题库实战解析与避坑指南
智鼎在线测评通关秘籍:2024最新51job题库实战解析与避坑指南 在竞争激烈的求职市场中,智鼎在线测评已成为众多知名企业筛选人才的第一道门槛。据统计,2024年使用智鼎测评系统的企业数量同比增长35%,而通过率却不足40%。这份指南将…...
