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

19_TypeScript 声明文件 --[深入浅出 TypeScript 测试]

TypeScript 声明文件(.d.ts 文件)用于描述 JavaScript 库或模块的类型信息,使得 TypeScript 编译器能够在使用这些库时提供类型检查和智能感知。声明文件并不包含任何实现代码,只定义了接口、类、函数等的类型签名。这对于确保类型安全和提高开发效率非常重要。

以下是关于 TypeScript 声明文件的一些关键概念和如何创建及使用它们的指南:

1. 什么是声明文件

TypeScript 声明文件(通常具有 .d.ts 扩展名)是用于描述 JavaScript 库或模块的类型信息的特殊文件。这些文件并不包含实际的实现代码,而是定义了库中所有公共 API 的类型签名,包括接口、类、函数、变量等。声明文件的主要目的是为了让 TypeScript 编译器能够理解第三方 JavaScript 代码的结构,从而提供静态类型检查和增强开发体验(如智能感知、自动补全、参数提示等)。以下是关于声明文件的一些关键点:

1. 为什么需要声明文件

  • 类型安全:通过为 JavaScript 库添加类型信息,开发者可以在使用这些库时获得编译时的类型检查,减少运行时错误。
  • 更好的工具支持:编辑器和 IDE 可以根据声明文件提供更强大的代码辅助功能,例如自动补全、参数提示、跳转到定义等。
  • 文档化 API:声明文件可以作为库的 API 文档,帮助开发者更好地理解和使用库的功能。

2. 声明文件的内容

声明文件中主要包含以下几种类型的声明:

  • 命名空间和模块声明:用于组织和导出一组相关的类型定义。
  • 接口声明:定义对象的形状,指定哪些属性和方法是可用的。
  • 类声明:描述类的构造函数、属性和方法。
  • 函数声明:指定函数的参数和返回值类型。
  • 变量声明:定义全局变量或模块级别的变量及其类型。
  • 类型别名:为复杂类型创建简单的名称。
  • 枚举声明:定义一组命名的常量值。
  • 泛型声明:允许在声明中使用泛型参数。

2. 何时需要声明文件

在使用 TypeScript 开发时,声明文件(.d.ts 文件)对于确保类型安全和提高开发体验非常重要。以下是一些需要创建或使用声明文件的具体场景:

1. 使用没有类型定义的 JavaScript 库

当你想在 TypeScript 项目中使用一个现有的 JavaScript 库,并且该库本身没有提供类型定义时,你需要创建一个声明文件来描述库的 API。这将使你能够在使用库的同时享受 TypeScript 的静态类型检查和智能感知功能。

示例:如果你想要使用 lodash 这样的库,但不想放弃 TypeScript 的类型安全性,你可以通过 @types/lodash 安装它的类型定义,或者如果找不到官方支持的类型定义,则可以自己编写一个。

npm install --save-dev @types/lodash

2. 为自定义 JavaScript 模块添加类型信息

如果你有一个自定义编写的 JavaScript 模块,并希望其他 TypeScript 代码能够以类型安全的方式使用它,那么你应该为这个模块创建相应的 .d.ts 声明文件。这样做不仅有助于维护代码质量,还能让其他开发者更容易理解和使用你的模块。

示例:假设你有一个名为 math-utils.js 的文件,其中包含了一些数学操作函数。你可以为其创建一个 math-utils.d.ts 文件来定义这些函数的参数和返回值类型。

3. 全局对象或浏览器 API 扩展

有时你需要为某些全局对象或浏览器内置 API 添加额外的属性或方法,而这些扩展并没有默认的类型定义。这时,你可以通过创建全局声明文件来定义这些新的成员。

示例:如果你想给 Window 接口添加一个新的方法 myCustomMethod,可以在全局声明文件中这样声明:

// global.d.ts
interface Window {myCustomMethod(): void;
}

4. 发布带有类型定义的 npm 包

如果你正在开发一个 npm 包,并希望用户能够在 TypeScript 项目中轻松地使用它,那么应该随包一起发布类型定义文件。这可以通过在项目的根目录下放置 .d.ts 文件并在 package.json 中设置 "types" 字段来实现。

示例:如果你的 npm 包是用纯 JavaScript 编写的,但你提供了详细的类型定义,那么可以在 package.json 中指定类型定义文件的位置:

{"name": "my-package","version": "1.0.0","types": "./index.d.ts"
}

5. 处理不兼容的类型定义

有时候你可能会遇到第三方库提供的类型定义与实际库的行为不一致的情况。在这种情况下,你可以选择覆盖或修正那些不准确的类型定义。通常可以通过创建自己的声明文件并调整它们来解决这个问题。

6. 为了更好的工具支持

即使你不直接依赖某个库,但你希望通过编辑器获得更好的代码补全、跳转到定义等功能,也可以安装对应的类型定义。例如,一些流行的前端框架如 React 或 Vue 都有丰富的类型定义,这使得开发体验更加流畅。

总结

总的来说,每当你要在 TypeScript 项目中引入外部 JavaScript 代码,并且希望保持类型安全性和良好的开发体验时,就需要考虑创建或使用声明文件。这不仅可以帮助你在编写代码时减少错误,还可以大大提升团队协作和代码维护的效率。通过适当地应用声明文件,你可以在充分利用现有 JavaScript 生态系统的同时,享受到 TypeScript 提供的所有好处。

3. 常见的声明文件形式

单独的声明文件

如果你有一个单独的 JavaScript 文件,你可以为其创建一个对应的 .d.ts 文件来定义它的类型。

example.js

function greet(name) {console.log(`Hello, ${name}!`);
}

example.d.ts

declare function greet(name: string): void;
示例:为 math-utils.ts 创建声明文件

它包含了一些简单的数学操作函数:

math-utils.ts

export function add(a: number, b: number): number {return a + b;}export function subtract(a: number, b: number): number {return a - b;}export function multiply(a: number, b: number): number {return a * b;}export function divide(a: number, b: number): number {if (b === 0) {throw new Error("Cannot divide by zero");}return a / b;}

为了在 TypeScript 中以类型安全的方式使用这些函数,我们需要为它们创建一个对应的 .d.ts 声明文件。

math-utils.d.ts

// 定义 math-utils.js 中所有公开的函数及其参数和返回值类型declare function add(a: number, b: number): number;declare function subtract(a: number, b: number): number;declare function multiply(a: number, b: number): number;declare function divide(a: number, b: number): number;
使用声明文件

一旦创建了声明文件,你就可以在 TypeScript 项目中导入并使用 math-utils.js 中的函数,同时获得类型检查和智能感知支持。

main.ts

/// <reference path="./math-utils.d.ts" />import { add, subtract, multiply, divide } from './math-utils';console.log(add(10, 5)); // 输出: 15
console.log(subtract(10, 5)); // 输出: 5
console.log(multiply(10, 5)); // 输出: 50
try {console.log(divide(10, 2)); // 输出: 5console.log(divide(10, 0)); // 抛出错误: Cannot divide by zero
} catch (error) {console.error(error.message);
}

请注意,在现代的 TypeScript 和模块系统(如 ES6 模块)中,通常不需要使用 /// <reference> 注释来引用声明文件。如果你已经正确配置了 tsconfig.json 并且你的模块路径设置正确,TypeScript 编译器应该能够自动找到并应用相应的声明文件。

tsconfig.json 配置

确保你的 tsconfig.json 文件配置正确,以便 TypeScript 知道在哪里查找类型定义文件。例如:

{"compilerOptions": {"target": "es6","module": "commonjs","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true},"include": ["src/**/*.ts", "src/**/*.d.ts"],"files": ["./math-utils.d.ts"]
}

在这个配置中,"include" 字段指定了哪些文件应该被编译,而 "files" 字段明确列出了需要包含的声明文件。如果你的项目结构允许,通常不需要指定 "files",因为 "include" 已经足够让 TypeScript 找到所有的 .ts.d.ts 文件。

总结

通过为 math-utils.js 创建一个 .d.ts 声明文件,我们不仅能够在 TypeScript 代码中安全地使用这些函数,还可以享受到编辑器提供的智能感知功能,比如参数提示、跳转到定义等。这极大地提高了开发效率,并减少了运行时错误的可能性。

模块声明文件

对于 ES6 模块或 CommonJS 模块,你应该在一个单独的 .d.ts 文件中声明该模块的内容。

myLibrary.js

export function add(a, b) {return a + b;
}

myLibrary.d.ts

export function add(a: number, b: number): number;
配置 tsconfig.json

确保你的 tsconfig.json 文件配置正确,以便 TypeScript 知道在哪里查找类型定义文件。例如:

{"compilerOptions": {"target": "es6","module": "commonjs","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"outDir": "./dist","rootDir": "./src"},"include": ["src/**/*.ts", "src/**/*.d.ts"]
}

在这个配置中,"include" 字段指定了哪些文件应该被编译,包括 .ts.d.ts 文件。如果你的项目结构允许,通常不需要显式列出所有文件,因为 "include" 已经足够让 TypeScript 找到所有的相关文件。

更复杂的模块声明文件示例

如果模块更加复杂,比如包含类、接口或命名空间,那么声明文件也会相应地变得更加复杂。下面是一个稍微复杂一点的例子,展示了如何为包含类和接口的模块创建声明文件。

复杂的 TypeScript 模块(带类和接口)

complex-module.ts

export interface Shape {area(): number;
}export class Circle implements Shape {constructor(public radius) {}area() {return Math.PI * this.radius * this.radius;}
}export class Rectangle implements Shape {constructor(public width, public height) {}area() {return this.width * this.height;}
}
对应的声明文件

complex-module.d.ts

// 定义接口 Shape
export interface Shape {area(): number;
}// 实现 Shape 接口的 Circle 类
export class Circle implements Shape {constructor(radius: number);area(): number;
}// 实现 Shape 接口的 Rectangle 类
export class Rectangle implements Shape {constructor(width: number, height: number);area(): number;
}

通过这种方式,你可以为更复杂的模块提供详细的类型信息,从而确保在 TypeScript 项目中使用这些模块时能够获得全面的类型安全性和开发辅助功能。

总结

通过为 math-utils.jscomplex-module.js 创建相应的 .d.ts 文件,我们不仅能够在 TypeScript 代码中安全地使用这些模块,还可以享受到编辑器提供的智能感知功能,比如参数提示、跳转到定义等。这极大地提高了开发效率,并减少了运行时错误的可能性。模块声明文件是确保第三方库和自定义模块在 TypeScript 项目中类型安全的关键工具。

全局声明文件

如果你想为全局变量或浏览器 API 添加类型定义,可以在一个全局声明文件中进行声明。

global.d.ts

declare const myGlobalVar: string;interface Window {myCustomMethod(): void;
}

4. 如何创建声明文件

  • 为现有库创建声明文件:如果你正在使用一个没有类型定义的库,可以为它创建一个 .d.ts 文件并定义其类型。确保覆盖所有公开的 API。

  • 发布你的库时包含声明文件:如果你自己编写了一个库,应该同时提供相应的类型定义文件,以便其他开发者可以受益于类型检查和智能感知。

5. 使用现有的声明文件

  • 通过 @types 安装:许多流行的库都有社区维护的类型定义文件,可以通过 npm 安装。

    npm install --save-dev @types/library-name
    
  • 直接引用声明文件:如果库自带类型定义或你有自定义的 .d.ts 文件,可以直接在代码中通过 /// <reference path="..." />import 语句引用它们。

6. 最佳实践

  • 保持简洁:尽量只暴露必要的公共 API 的类型定义,避免不必要的复杂性。
  • 遵循标准:尽可能遵循 TypeScript 和 JavaScript 社区的标准和约定。
  • 测试:确保声明文件与实际库的行为相匹配,最好能有一些简单的测试用例来验证类型定义是否正确。
  • 文档化:为复杂的类型定义添加注释和文档,帮助其他开发者理解。

7. 示例:为 jQuery 创建声明文件

这里是一个简化版的 jQuery 类型定义的例子:

jquery.d.ts

// 声明 jQuery 函数
declare function jQuery(selector: string): JQuery;// 声明 jQuery 静态方法
interface JQueryStatic {(selector: string): JQuery;ajax(url: string, settings?: any): void;
}// 声明 jQuery 实例方法
interface JQuery {html(): string;html(content: string): JQuery;on(event: string, handler: (eventObject: Event) => void): JQuery;
}// 将 jQuery 设置为全局变量
declare var $: JQueryStatic;
declare var jQuery: JQueryStatic;

总结

声明文件是 TypeScript 生态系统中不可或缺的一部分,它们使得我们可以安全地与 JavaScript 世界交互,同时享受静态类型的诸多好处。了解如何创建和使用声明文件可以帮助我们构建更加健壮、易于维护的应用程序。无论是为现有的库添加类型定义,还是为自己的项目发布类型信息,掌握这一技能都是非常有价值的。

相关文章:

19_TypeScript 声明文件 --[深入浅出 TypeScript 测试]

TypeScript 声明文件&#xff08;.d.ts 文件&#xff09;用于描述 JavaScript 库或模块的类型信息&#xff0c;使得 TypeScript 编译器能够在使用这些库时提供类型检查和智能感知。声明文件并不包含任何实现代码&#xff0c;只定义了接口、类、函数等的类型签名。这对于确保类型…...

如何当前正在运行的 Elasticsearch 集群信息

要查看当前正在运行的 Elasticsearch 集群信息&#xff0c;可以通过以下几种方法&#xff1a; 1. 使用 _cluster/health API _cluster/health API 返回集群的健康状态、节点数量、分片状态等信息。可以用 curl 命令直接访问&#xff1a; curl -X GET "http://localhost…...

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…...

【hadoop学习遇见的小问题】centos常见配置 添加组用户权限 修改主机名等

1、指定静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0修改BOOTPROTO为static BOOTPROTOstatic IPADDR192.168.80.145 NETMASK255.255.255.0 GATEWAY192.168.80.2IPADDR、NETMASK用ifconfig命令即可查看 GATEWAY如何查看&#xff08;编辑—虚拟网络编辑器—上面选择NA…...

16_Redis Lua脚本

Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…...

Appium版本升级,需要注意哪些点:使用UiAutomator2Options传递capabilities

mac上安装的是较新的Appium版本&#xff0c;在跑之前写的Android UI 自动化代码时报错&#xff1a;AttributeError: dict object has no attribute to_capabilities。 查了一下资料&#xff0c;这是因为较新的 Selenium 和 Appium 版本要求使用 Options 类来定义能力&#xff…...

MySQL的增删改查(基础)-下篇

修改 真正在改硬盘了&#xff0c;这样的修改是“持久有效”。一定要确保&#xff0c;update的修改是改对了&#xff0c;改出问题来就麻烦。指定update的时候&#xff0c;如果当前不指定任何条件&#xff0c;就会针对所有的行都能生效&#xff01; (把整个表都给改了)。 案例 --…...

Mysql--基础篇--事务(ACID特征及实现原理,事务管理模式,隔离级别,并发问题,锁机制,行级锁,表级锁,意向锁,共享锁,排他锁,死锁,MVCC)

在MySQL中&#xff0c;事务&#xff08;Transaction&#xff09;是一组SQL语句的集合&#xff0c;这些语句一起被视为一个单一的工作单元。事务具有ACID特性&#xff0c;确保数据的一致性和完整性。通过事务&#xff0c;可以保证多个操作要么全部成功执行&#xff0c;要么全部不…...

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时&#xff0c;普通应用是无法使用的&#xff0c;需要在AndroidManifest中配置sharedUserId&#xff1a; AndroidManifest.xml中的android:sharedUserId“android.uid.system”&#xff0c;代表的意思是和系统相同的uid&a…...

Vue篇-06

1、路由简介 vue-rooter&#xff1a;是vue的一个插件库&#xff0c;专门用来实现SPA应用 1.1、对SPA应用的理解 1、单页 Web 应用&#xff08;single page web application&#xff0c;SPA&#xff09;。 2、整个应用只有一个完整的页面 index.html。 3、点击页面中的导航链…...

学习threejs,导入wrl格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.VRMLLoader wrl模型加…...

winform第三方界面开源库AntdUI的使用教程保姆级环境设置篇

1. AntdUI 1.1. 导入项目 1.1.1. 首先新建一个空白的基于.net的Winfrom项目1.1.2. 复制AntdUI中src目录到我们的解决方案下面1.1.3. 解决方案下添加现有项目1.1.4. 添加项目引用 1.2. 编写代码 1.2.1. 改写Form1类&#xff0c;让其继承自public partial class Form1 : AntdUI.W…...

likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法

前言&#xff1a;首先likeshop是一个开发平台&#xff0c;是一个独创的平台就像TP内核平台一样&#xff0c;你可以在这个平台上开发和衍生出很多伟大的产品&#xff0c;以likeshop为例&#xff0c;他们开发出商城系统&#xff0c;团购系统&#xff0c;外卖点餐系统&#xff0c;…...

java -jar启动项目报错:XXX.jar中没有主清单属性

XXX.jar中没有主清单属性 1、错误复现2、错误原因3、解决方案 java -jar启动项目报错&#xff1a;XXX.jar中没有主清单属性 1、错误复现 今天使用springboot给项目打了jar包&#xff0c;使用命令启动时报错&#xff0c;截图如下&#xff1a; 2、错误原因 项目的pom文件配置如…...

浅谈云计算03 | 云计算的技术支撑(云使能技术)

云计算的技术支撑 一、定义与内涵1.1 定义与内涵 二、云计算使能技术架构2.1 宽带网络和 Internet 架构2.2 数据中心技术2.3 虚拟化技术2.4 Web 技术2.5 多租户技术2.6 服务技术 一、定义与内涵 1.1 定义与内涵 云计算技术包含一些基础的关键技术&#xff0c;这里称为使能技术…...

使用LinkedList手撕图的邻接表

主要是学习图的邻接表的核心结构等等&#xff0c;话不多说直接上代码&#xff1a; import java.util.LinkedList;public class GrapAdj {private int n ; // 表示图中顶点的数量。private LinkedList<Integer>[] adj;public GrapAdj(int n){this.n n;adj new LinkedLis…...

学习RocketMQ

1.为什么要用MQ&#xff1f; 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下4个方面&#xff1a; 1.1 异步解耦​ 最常见的一个场景是用户注册后&#xff0c;需要发送注册邮件和短信通知&#xff0c;以告知用户注册成功。传统的做法有以下两种&#xff1a; …...

sap mm学习笔记

1. 业务流程 2. 组织架构 3. 物料主数据 4.采购主数据 5. 采购管理 6. 库存管理 7.物料主数据 8. 采购申请 ME51N...

Dockerfile 构建java镜像并运行部署java项目

目录 1. 前提准备 2. 什么是Dockerfile 3. 步骤 3.1. 创建目录 3.2. 编写dockerfile文件 3.3. 构建镜像 3.4. 运行容器 3.5. 验证 4. 总结 1. 前提准备 (1) 准备一个jar打包文件,已为大家准备(我这里的包名为 app.jar) 资源链接&#xff0c;点我下载 (2) 已经下载…...

【C语言系列】函数递归

函数递归 一、递归是什么&#xff1f;1.1尾递归 二、递归的限制条件三、递归举例3.1举例一&#xff1a;求n的阶乘3.2举例二&#xff1a;顺序打印一个整数的每一位 四、递归与迭代4.1举例三&#xff1a;求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么&#xff1f; …...

windows10 安装 Golang 版本控制工具g与使用

下载包&#xff1a;https://github.com/voidint/g/releases 解压&#xff0c; 并添加到环境变量 g 常用命令 查询当前可供安装的stable状态及所有的 go 版本 # stable 版本 g ls-remote stable# 所有版本 g ls-remote安装目标 go 版本1.23.4g install 1.23.4切换到已安装的…...

WordPress开发进群V2主题,多种引流方法,引私域二次变现

介绍&#xff1a; 全新前端UI界面&#xff0c;多种前端交互特效让页面不再单调&#xff0c;进群页面群成员数&#xff0c;群成员头像名称&#xff0c;每次刷新页面随机更新不重复&#xff0c;最下面评论和点赞也是如此随机刷新不重复 进群页面简介&#xff0c;群聊名称&#…...

在 CentOS/Red Hat Linux 中安装 Docker

在 Red Hat Linux 中安装 Docker 在 Red Hat Linux (RHEL) 中安装 Docker 需要一些准备工作&#xff0c;尤其是针对不同版本的系统&#xff08;如 RHEL 7、8、9&#xff09;。以下是具体的安装步骤&#xff1a; 步骤 1&#xff1a;检查系统版本 在安装前&#xff0c;确认系统…...

【DAPM杂谈之二】实践是检验真理的标准

本文主要分析DAPM的设计与实现 内核的版本是&#xff1a;linux-5.15.164&#xff0c;下载链接&#xff1a;Linux内核下载 主要讲解有关于DAPM相关的知识&#xff0c;会给出一些例程并分析内核如何去实现的 /**************************************************************…...

关于使用FastGPT 摸索的QA

近期在通过fastGPT&#xff0c;创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上&#xff0c;可以定义业务逻辑&#xff0c;满足输出对话之外的需求。 在最近3个月来的摸索和实践中&#xff0c;一些基于经验的小问题点&#xff08;自己也常常…...

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…...

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数&#xff0c;用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务&#xff0c;直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork&#xff0c;以及渲染新状态或 DOM。 function ren…...

Xcode 正则表达式实现查找替换

在软件开发过程中&#xff0c;查找和替换文本是一项常见的任务。正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的工具&#xff0c;可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具&#xff0c;提供了对正则表达式的支持。本…...

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中&#xff0c;可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓&#xff1a; findContours() 函数 findContours) 函…...

excel VBA 基础教程

这里写目录标题 快捷键选择所有有内容的地方 调试VBA录制宏&#xff0c;打开VBA开发工具录制宏,相当于excel自动写代码&#xff08;两个表格内容完全一致才可以&#xff09; 查看宏代码保持含有宏程序的文件xlsm后缀&#xff08;注意很容易有病毒&#xff09;宏文件安全设置 使…...

2008-2019年各省城镇人口数据

2008-2019年各省城镇人口数据 1、时间&#xff1a;2008-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、城镇人口 4、范围&#xff1a;31省 5、指标解释&#xff1a;城镇人口是指居住在城镇范围内的全部常住人口。 6、下…...

【机器学习】在不确定的光影中:机器学习与概率论的心灵共舞

文章目录 概率与统计基础&#xff1a;解锁机器学习的数据洞察之门前言一、概率论基础1.1 概率的基本概念与性质1.1.1 概率的定义1.1.2 样本空间与事件1.1.3 互斥事件与独立事件1.1.4 概率的计算方法 1.2 条件概率与独立性1.2.1 条件概率1.2.2 独立事件 1.3 随机变量1.3.1 随机变…...

vscode使用Marscode编程助手

下载 vscode 在插件里下载Marscode编程助手 插件完成 在这里点击安装&#xff0c;点击后这里出现AI编程插件。...

谷歌开放语音命令数据集,助力初学者踏入音频识别领域

在人工智能的浪潮中&#xff0c;语音识别技术正逐渐成为我们日常生活的一部分。从智能助手到语音控制设备&#xff0c;语音识别的应用场景越来越广泛。然而&#xff0c;对于初学者来说&#xff0c;进入这一领域往往面临诸多挑战&#xff0c;尤其是缺乏合适的开源数据集和简单的…...

Diffchecker图像比较工具介绍

Diffchecker图像比较工具介绍 网站地址&#xff1a; Diffchecker图像比较 主要功能&#xff1a; 图像差异比较&#xff1a; 该工具允许用户上传两张图片&#xff0c;系统会自动识别并高亮显示这两张图片之间的差异。简单易用&#xff1a; 用户只需将图片拖放到指定区域或点击浏…...

后端开发 Springboot整合Redis Spring Data Redis 模板

目录 redis 配置 RedisConfig 类 完整代码 代码讲解 1. 类定义和注解 2. 定义 RedisTemplate Bean 3. 配置 JSON 序列化 4. 配置 Redis 的 key 和 value 序列化方式 5. 完成配置并返回 RedisTemplate 总结 redis 服务接口实现类 类级别 注入 RedisTemplate 常用 Re…...

极狐GitLab 正式发布安全版本17.7.1、17.6.3、17.5.5

本分分享极狐GitLab 补丁版本 17.7.1, 17.6.3, 17.5.5 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…...

策略模式详解与应用

策略模式&#xff08;Strategy Pattern&#xff09;&#xff0c;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;而应用程序可以在运行时选择使用哪一个算法。策略模式使得算法的变化独立于使…...

Gateway怎么实现限流的

Gateway怎么实现限流的 在API网关&#xff08;如Spring Cloud Gateway、Kong、Nginx等&#xff09;中实现限流是为了控制服务请求的频率&#xff0c;从而避免系统过载&#xff0c;确保稳定性和可用性。限流可以通过多种策略实现&#xff0c;常见的方法包括基于请求次数、时间窗…...

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术&#xff0c;其基本原理在于通过计算图像模板中邻域内的均值和方差&#xff0c;选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明&#xff1a; 一、基本思想 Kuwahara滤波的基本思想…...

【DevOps】Jenkins使用Pipeline构建java代码

使用Pipeline发布java项目 文章目录 使用Pipeline发布java项目资源列表基础环境一、准备gitlab1.1、部署gitlab1.2、创建chinanews项目1.3、提交代码1.4、查看上传的代码 二、准备Jenkins2.1、部署Jenkins2.2、安装maven2.3、修改Maven源2.4、准备chinanews 三、Jenkins配置工具…...

【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题

文章目录 选择题理论题 解释RIP协议中的“水平分割”机制&#xff0c;并说明其目的。 可以防止路由器错误地将从邻居学到的路由再发送回给该邻居&#xff0c;从而避免路由环路的发生。实操题 【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论…...

Entity 的材质(棋盘、条纹、网格)

Entity 的材质 普通物体的材质 import { nextTick, onMounted, ref } from vue import * as Cesium from cesium // console.log(Cesium, Cesium)const viewer ref<any>(null)onMounted(() > { ... })let material Cesium.Color.YELLOW.withAlpha(0.5)Cesium.Colo…...

shell脚本编写练习3

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 #!/bin/bash # 定义文件路径变量 file_path"/tmp/size.log"# 使用if语句检查文件是否存在 if [ -e "$file_path" ] # 检查变量file_path…...

事务的隔离级别和MDL

文章目录 说明不同隔离级别可能发生的现象关键现象解释MDL&#xff08;元数据锁&#xff0c;Metadata Lock&#xff09;MDL 的作用MDL 的工作原理MDL 锁的常见场景如何避免 MDL 阻塞 说明 本文章由大模型对话整理而来&#xff0c;如果有错误之处&#xff0c;请在评论区留言指正…...

用户界面软件05

已知应用 几乎所有的流行的用户界面架构都使用这种模式。我在这里举三个例子&#xff1a; 1. Seeheim 用户界面架构的特点是有一个应用核心的领域层和一个用户界面层。后者 被分为两层&#xff0c;叫做表示层和对话控制层。因为这个架构和面向事务系统有渊源&#xff0c;没有…...

基于Springboot + vue实现的办公用品管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…...

17_Redis管道技术

Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…...

​Vue虚拟DOM:如何提高前端开发效率

前言 随着前端技术的不断发展&#xff0c;越来越多的框架和库涌现出来&#xff0c;其中Vue.js成为了最受欢迎的前端框架之一。Vue.js采用了响应式数据绑定和组件化的思想&#xff0c;让开发者可以更加高效地构建交互式的用户界面。而Vue.js的底层原理涉及到许多概念和技术&…...