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

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介

TypeScript 是 JavaScript 的超集,是 JavaScript(弱类型语言) 的强类型版本。

  • 拥有类型机制
  • 文件后缀 .ts
  • Typescript = type + ES6
  • TypeScript 和 JavaScript 的关系类似 less 和 css 的关系
  • TypeScript对 JavaScript 添加了一些扩展,如 class / interface / module 等,大大提升代码的可阅读性。
  • 不能在浏览器直接执行,而是编译成 JavaScript (去掉类型和特有语法)后才会运行:

与 JavaScript 相比的优势

  • 静态类型检查,可以在代码开发阶段就预知一些低级错误的发生。

类型声明文件

以为.d.ts 为后缀的文件,内容为 TS 语法编写的各种类型声明(定义数据,函数、接口或类的类型)

  • 通常安装第三方库后,若缺少类型声明文件,会有报错提示安装必要的类型声明文件
    在这里插入图片描述

  • 若没有提示,则可以在 https://www.npmjs.com/ 中搜索相应的类型声明文件

    搜索关键字为 @type/第三方库的名称

    在这里插入图片描述

  • 有的库没有类型声明文件,可以自己写,点我了解详细语法

  • 也可以用命令行生成类型文件,点我了解详情

学习资料

英文官网

https://www.typescriptlang.org/

中文文档
https://www.tslang.cn/docs/home.html

https://typescript.bootcss.com/

在线开发环境

https://www.typescriptlang.org/play/index.html

搭建本地开发环境

  1. 新建文件夹 TSdemo

  2. 初始化项目

npm init -y
  1. 安装必要的依赖
npm i -D typescript nodemon ts-node
  • typescript 用于将 TS 编译成 JS
  • nodemon 用于 node 进程的重启
  • ts-node 用于直接执行 TS 类型的文件
  1. 项目目录下创建文件 index.ts
let myNname: string = "朝阳";console.log(myNname);
  1. 修改 package.json 中的 scripts 为
  "scripts": {"start": "nodemon --exec ts-node index.ts"},
  1. 初始化 ts 的配置
npx tsc --init

执行成功后,会生成文件 tsconfig.json

  1. 启动项目
    在这里插入图片描述
    在这里插入图片描述

声明类型

值类型

// 字符串
let myNname: string = "朝阳";// 数字
let num: number = 10;// 布尔类型
let ifLogin: boolean = true;
// 布尔类型支持赋值计算之后结果是布尔值的表达式
let bool: boolean = !!0// null
let n: null = null;// undefined
let u: undefined = undefined;// symbol
let s: symbol = Symbol();

数组 []

// 空数组
let arr: [] = [];// 元素只能是数字的数组(其他类型的写法类似)
let arr1: number[] = [1, 2];// 元素只能是数字或字符串的数组(| 表示或的关系)
let arr2: (number | string)[] = [1, "朝阳"];// 即是number类型也可能是string数组
const numbers1: number[] | string[] = ['123', '333'] // 正确
const numbers2: number[] | string[] = [123, '333'] // 错误// 对象数组
let todoList: {id: number;label: string;done: boolean;
}[] = [{id: 1,label: "吃饭",done: false,},{id: 2,label: "编程",done: false,},
];// 使用类型别名(type alias)
type User = { name: string; age: number }// 存储对象类型的内容
const objectArr: User[] = [{name: 'zws',age: 18}
]// 构造函数声明类型
let arr_1: Array<number> = [1, 2];
let arr_2: Array<number | string> = [1, "朝阳"];

对象 {}

// 空对象
let o: {} = {};
let o2: object = {};// 必选属性的对象(赋值时,声明的属性必须有!)
let user: {name: string;age: number;
} = {name: "朝阳",age: 35,
};// 可选属性的对象(可选属性需写在必选属性的后面!)
let user2: {name: string;age?: number;
} = {name: "晚霞",
};

Object 、 {} 、 object 的区别

  • 与Object类型相同的{}是最不具体的,可以将对象、数组和基元分配给它;

  • object是更具体的,类似于{ [key: string]: any };可以给它分配对象和数组,但不能分配原始类型的数据;

  • { [key: string]: string }是最具体的,它不允许任何原始类型、数组或具有非字符串值的对象被分配到它。

var o: object;
o = { prop: 0 }; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Errorvar p: {}; // or Object
p = { prop: 0 }; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Errorvar q: { [key: string]: any };
q = { prop: 0 }; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Errorvar r: { [key: string]: string };
r = { prop: 'string' }; // OK
r = { prop: 0 }; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error

类 class

class Person {}
const me: Person = new Person()class Teacher {name: stringage: number
}const objectArr: Teacher[] = [new Teacher(),{name: 'zws',age: 18}
]

新增类型

以下类型为 TS 新增的,在 js 中不存在的数据类型

任意类型 any

当不确定变量的类型时(比如来自用户输入或第三方代码库的动态内容),可以使用,但尽量少用。

  • 任何类型的值都可以赋值给 any 类型的变量
let a: any = '你好'
a = 0// 多数据类型的数组
let list: any[] = [1, true, "free"];

未知的类型 unknown

TypeScript3.0版本新增的类型

  • 任何类型的值都可以赋值给 unknown 类型的变量
  • any 与 unknown 的区别 : unknown 需要明确类型后执行操作,any 则不需要
let a: unknown = 1;let b = a + 1; // 会报错 “a”的类型为“未知”

可通过 as 声明类型解决

let a: unknown = 1;let b = (a as number) + 1;

永不存在的值 never

用于总会抛出异常或根本不会有返回值的函数表达式的返回值类型。
当变量被永不为真的类型保护所约束时,该变量也是 never 类型。

用途

  • 限制类型
  • 控制流程
  • 类型运算
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {throw new Error(message);
}// 推断的返回值类型为never
function fail() {return error("Something failed");
}// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {while (true) {}
}

无类型 Void

即什么类型都不是,通常用于描述函数没有返回值

function test(): void {
}

void类型的变量只能被赋予undefinednull

let test: void = undefined;

元组 Tuple

即固定长度和类型的数组

let x: [string, number];
x = ['hello', 10];

枚举 enum

一种全新的数据描述方式,用于描述一组数量有限的系列数据。

数值枚举(默认)

// 枚举三原色
enum Color {Red, Green, Blue}
// 按枚举内容的字符串取值,得到的是对应的下标(类似数组的下标,从0开始)
let c: Color = Color.Green;  // c的值为1 
// 枚举方向:上下左右
enum Direction {Up,Down,Left,Right
}// 按下标取值,可得到枚举内容的字符串
console.log(Direction[0]) // "Up"

可以自定义下标的起点

// 将默认的下标 0  改为 下标 1,则后续下标会依次递增
enum Direction {Up = 1,Down,  // 2Left,  // 3Right  // 4
}

也可以自定义任意下标,未定义的在上一个的基础上递增

enum Direction {Up = 11,Down, // 12Left = 6, Right, // 7
}

甚至下标可以相同

enum Direction {Up = 11,Down, // 12Left = 11,Right, // 12
}console.log(Direction.Down); // 打印 12console.log(Direction); // 打印 { '11': 'Left', '12': 'Right', Up: 11, Down: 12, Left: 11, Right: 12 }

如果下标使用了计算值或常量,那么该字段后面紧接着的字段必须设置初始值,不能默认递增值了!

const getValue = () => {return 0;
};
enum ErrorIndex {a = getValue(),b, // error 枚举成员必须具有初始化的值c
}
enum RightIndex {a = getValue(),b = 1,c
}
const Start = 1;
enum Index {a = Start,b, // error 枚举成员必须具有初始化的值c
}

字符串枚举

枚举成员为字符串时,其之后的成员也必须是字符串。

enum Direction {Up, // 未赋值,默认为0Down = '南',Left = '西',Right = '东'
}

类型断言 as

当你知道更确切的类型时,可以使用类型断言,类似类型转换,但不进行特殊的数据检查和解构。

它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设程序员已经进行了必须的检查。

let someValue: any = "this is a string";

方式一:as 【推荐】

let strLength: number = (someValue as string).length;

JSX中,只可用 as 语法断言

方式二:<>

let strLength: number = (<string>someValue).length;

函数

声明函数类型

  • 如果省略参数的类型,TypeScript 会默认这个参数是 any 类型;

  • 如果省略返回值的类型,如果函数无返回值,那么 TypeScript 会默认函数返回值是 void 类型;

  • 如果函数有返回值,那么 TypeScript 会根据我们定义的逻辑推断出返回类型。

  • 函数体内使用的外部变量的类型,不会体现在函数类型定义中。

// 命名函数
function add(arg1: number, arg2: number): number {return x + y;
}// 箭头函数
const add = (arg1: number, arg2: number): number => {return x + y;
};
// 定义变量 add 并声明为函数类型
let add: (x: number, y: number) => number;add = (arg1: number, arg2: number): number => arg1 + arg2;

使用 Interface 声明函数类型

interface Add {(x: number, y: number): number;
}

使用 type 声明函数类型

type Add = (x: number, y: number) => number;

可选参数

可选参数需放置在必选参数之后,用 ? 标注

let add: Add = (arg1: number, arg2?: number): string => arg1 + arg2;

默认参数

  • = 号标注参数的默认值
  • 所有必须参数后面的带默认初始化的参数都是可选的
function add(x: number, y: number = 20): number {return x + y
}

剩余参数

const handleData = (arg1: number, ...args: number[]) => {//
};

函数重载

强类型语言中的函数重载:定义几个函数名相同,但参数个数或类型不同的函数,在调用时传入不同的参数,编译器会自动调用适合的函数。

TS 中的函数重载:通过为一个函数指定多个函数类型定义,从而对函数调用的返回值进行检查。

  • 只能用 function 来定义,不能使用接口、类型别名等。
// 这个是重载的一部分,指定当参数类型为string时,返回值为string类型的元素构成的数组
function handleData(x: string): string[];
// 这个也是重载的一部分,指定当参数类型为number时,返回值类型为string
function handleData(x: number): string; // 这个就是重载的内容了,这是实体函数,不算做重载的部分
function handleData(x: any): any { if (typeof x === "string") {return x.split("");} else {return x.toString().split("").join("_");}
}handleData("abc").join("_");
handleData(123).join("_"); // error 类型"string"上不存在属性"join"
handleData(false); // error 类型"boolean"的参数不能赋给类型"number"的参数。

接口 interface

用于自定义任意类型

interface Point {x: number;y: number;
}interface Point {x: number,y: number
}
  • 每个属性间的间隔,可以说 ; 也可以是,
interface Person {name: string,age: number
}// 使用范例
let user: Person = {name: '朝阳',age: 30
}

可选属性 ?

interface Point {x: number;y?: number;
}

可选属性的位置没有限制,无需像函数的可选参数一样,必须放在必传参数的后面。

只读属性 readonly

interface Point {readonly x: number;readonly y: number;
}

赋值后, xy再也不能被改变

let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!

属性的合并

interface Person {name: string;
}interface Person {age: number;
}let user: Person = {name: "朝阳",age: 35,
};

但已经指定过类型的属性,不能改为新类型

interface Person {name: string;
}interface Person {name: number; // 报错 后续属性声明必须属于同一类型
}

若想定义为联合类型,也需在最初的地方定义!

interface Person {name: string | number;
}

定义函数类型

interface SumFunc {(a: number, b: number): number;
}let c: SumFunc = (a, b) => a + b;let d = c(1, 2);

定义索引类型

当定义了索引类型之后,数组的length方法,将不存在,包括Array原型链上的其他方法也不存

interface Dic {[id: number]: string;
}const dic1: Dic = {0: "你",1: "好",
};const dic2: Dic = ["你", "好"];

定义类类型(含接口的实现 implements )

用于给类添加约束,比如限定类必须含有某类型的属性/方法等。

// 定义接口 ClockInterface,有一个属性 currentTime,值类型为 Date
interface ClockInterface {currentTime: Date;
}// 定义类 Clock 实现接口 ClockInterface
class Clock implements ClockInterface {// 因接口 ClockInterface 中有一个Date 类型的属性 currentTime,所以 类 Clock 也必须有这个属性currentTime: Date;constructor(arg: Date) {// 在构造方法中,需给接口 ClockInterface 限定的属性 currentTime 赋值this.currentTime = arg;}
}

可简写为

class Clock implements ClockInterface {constructor(public currentTime: Date) {}
}

绕开多余属性的类型检查

在这里插入图片描述

方式一:索引签名 【推荐】

interface myType {name: string;// 添加索引签名来兼容多余属性[prop: string]: any;
}

方式二:类型断言 【不推荐】

强行声明其为目标类型

let myInfo: myType = {name: "朝阳",age: 30,
} as myType;

方式三:类型兼容 【不推荐】

interface myType {name: string;
}// 使用解构赋值,避开多余属性
let getName = ({ name }: myType) => {return name;
};let myInfo = {name: "朝阳",age: 30,
};console.log(getName(myInfo));

接口的继承 extends

与类的继承类似

// 基础类型 Person
interface Person {name: string;
}// Student 类型在 Person类型的基础上,新增了学号 sid
interface Student extends Person {sid: number;
}// Teacher 类型在 Person类型的基础上,新增了学科 class
interface Teacher extends Person {class: string;
}let student1: Student = {name: "朝阳",sid: 1,
};let teacher1: Teacher = {name: "朝阳",class: "前端开发",
};

同时继承多个接口

extends 后写多个接口即可,用 , 间隔

interface Shape {color: string;
}interface PenStroke {penWidth: number;
}interface Square extends Shape, PenStroke {sideLength: number;
}

接口继承类

  • 接口继承了类之后,会继承成员(类型),但是不包括实现;
  • 接口还会继承 private 和 protected 修饰的成员,但是这个接口只可被这个类或它的子类实现
// 定义类 Person
class Person {name: string;constructor(arg: string) {this.name = arg;}
}// 接口 I 继承类 Person
interface I extends Person {}// 接口 I 只能被 类 Person 或 类 Person 的子类实现 implements
class Student extends Person implements I {}

泛型

在定义函数、接口或类的时候不预先指定数据类型,而在使用时再指定类型的特性。

泛型的作用

泛型可以提升应用的可重用性,如使用其创建组件,则可以使组件可以支持多种数据类型。

使用泛型

let printNum = (arg: number) => {console.log(arg);
};printNum(123);
printNum("123"); // 会报错,因参数只能是数字
let printString = (arg: string) => {console.log(arg);
};printString(123); // 会报错,因参数只能是字符串
printString("123");

怎样才能写一个通用的打印方法呢?
使用泛型!

let printAnyType = <T>(arg: T) => {console.log(arg);
};printAnyType(123);
printAnyType("123");

可见泛型即将类型设定为一个变量,当代码执行时传入的类型是啥,它就是啥,从而大大拓展了代码的通用性。

泛型的语法

  • <> 包裹
  • 类型的变量通常用大写字母 T 表示,也可以是任意其他大写字母

多个泛型

// 定义函数 - 让元组中的两个元素互换位置
let exchange = <T, U>(tuple: [T, U]): [U, T] => {return [tuple[1], tuple[0]];
};let tuple1: [number, string] = [1, "朝阳"];let tuple2 = exchange(tuple1);console.log(tuple2);

相关文章:

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介 TypeScript 是 JavaScript 的超集&#xff0c;是 JavaScript&#xff08;弱类型语言&#xff09; 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…...

智慧校园-实训管理系统总体概述

智慧校园实训管理系统&#xff0c;专为满足高等教育与职业教育的特定需求而设计&#xff0c;它代表了实训课程管理领域的一次数字化飞跃。此系统旨在通过革新实训的组织结构、执行流程及评估标准&#xff0c;来增强学生的实践操作技能和教师的授课效率&#xff0c;为社会输送具…...

如何用GPT开发一个基于 GPT 的应用?

原文发自博客&#xff1a;GPT应用开发小记 如何开发一个基于 GPT 的应用&#xff1f;答案就在问题里&#xff0c;那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例&#xff0c;分享我是如何基于 GPT 去开发这个系统的&#xff0c;这个系统的功能…...

大数据生态体系中各组件的区别面试题(更新)

一、MapReduce与Spark有什么区别&#xff1f; 1、处理方式: MapReduce基于磁盘处理数据&#xff0c;将中间结果保存到磁盘中,减少了内存占用&#xff0c;计算速度慢。 基于内存处理数据&#xff0c;将计算的中间结果保存到内存中&#xff0c;计算速度快。2、资源申请方式&…...

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)

实验要求&#xff1a; 离散信号及离散系统的MATLAB编程实现&#xff08;2学时&#xff09; 要求&#xff1a; 编写一程序&#xff0c;输出一定长度&#xff08;点数&#xff09;&#xff0c;具有一定幅度、&#xff08;角&#xff09;频率和初始相位的实&#xff08;或复&…...

数字图像处理专栏——introduction

Introduction: 数字图像处理技术是我在深入学习研究的方向之一。本科期间跟随导师做基于AndroidOpenCV的病虫识别app&#xff0c;因此入门&#xff0c;我也对该部分知识有进一步探索的欲望&#xff0c;但更多的是因该脚踏实地一步步记录&#xff0c;一步步成长。 本篇从数字图…...

Django 模版继承

1&#xff0c;设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…...

Apipost接口测试工具的原理及应用详解(一)

本系列文章简介&#xff1a; 随着软件行业的快速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为不同软件组件之间通信的桥梁&#xff0c;其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此&#xff0c;对API进行严格的测试成为…...

一款轻量级的通信协议---MQTT (内含Linux环境搭建)

目录 MQTT MQTT的关键特点&#xff1a; 应用场景 Linux环境搭建&#xff1a; 1. 安装mosquitto 2. Linux下客户端进行通信 3. PC端和Linux下进行通信 安装MQTT. fx 4. MQTT.fx的使用 1. 点击连接 ​编辑 2. 连接成功 3. 订阅主题或者给别的主题发送消息 遇到的问…...

记netty本地客户端断线无法自动重连 or 远程客户端自动重连本地服务端

记netty客户端断线无法自动完成重连 or 服务端无法让客户端断线重连 引场景案例bootstrap 引 netty既能开发socket服务端&#xff0c;也可开发客户端&#xff0c;实现连接的全双工通信。在客户端断线重启后&#xff0c;可自动重连服务端。 场景 本地代码既有socket客户端也有…...

UNIAPP_在js文件中使用i18n国际化

导入 import { initVueI18n } from dcloudio/uni-i18n import messages from /locale/index const { t } initVueI18n(messages) 使用 t(config.request.i001)....

第三节:如何理解Spring的两个特性IOC和AOP(自学Spring boot 3.x第一天)

大家好&#xff0c;我是网创有方&#xff0c;接下来教大家如何理解Spring的两个特性IOC和AOP。本节有点难&#xff0c;大家多理解。 IOC&#xff08;控制反转&#xff09; 定义与核心思想&#xff1a; IOC&#xff0c;全称Inversion of Control&#xff0c;即控制反转。 其核…...

【51单片机】串口通信(发送与接收)

文章目录 前言串口通信简介串口通信的原理串口通信的作用串口编程的一些概念仿真图如何使用串口初始化串口串口模式波特率配置 发送与接收发送接收 示例代码 总结 前言 在嵌入式系统的开发中&#xff0c;串口通信是一种常见且重要的通信方式。它以其简单、稳定的特性在各种应用…...

【AI研发工具包】sklearn教程(Scikit-learn)

目录 1. 引言 2. 安装sklearn 3. 导入sklearn 4. 加载数据集 5. 数据预处理 6. 训练模型 7. 评估模型 8. 保存和加载模型 9. 自定义数据 10. 深入sklearn 11. 注意事项 1. 引言 Scikit-learn&#xff08;简称sklearn&#xff09;是Python中一个非常流行的机器学习库…...

数位DP——AcWing 1081. 度的数量

数位DP 定义 数位DP是一种动态规划技巧&#xff0c;特别适用于处理与数字的位操作相关的问题&#xff0c;如数字序列的计数、数字的生成等问题。它通过将问题分解为对每一位数字的独立考虑&#xff0c;从而简化问题复杂度&#xff0c;实现高效求解。 数位DP的核心思想是将原…...

2024下半年必追国漫片单,谁将问鼎巅峰?

随着2024年上半年的落幕&#xff0c;国漫市场再度迎来了百花齐放的盛况。从经典续作到全新IP&#xff0c;从玄幻到科幻&#xff0c;每一部作品都以其独特的魅力吸引着观众的目光。本期为大家盘点下半年值得一看的国漫佳作&#xff0c;大胆预测&#xff0c;谁将成为这场神仙打架…...

信息发布小程序h5 uniapp thinkphp

纯手工uniapp thinkphp 全开源打造 信息发布小程序 一、概述 信息发布小程序是一种基于微信平台的小程序应用&#xff0c;旨在为用户提供便捷的信息发布与展示服务。用户可以通过该小程序快速发布各类信息&#xff0c;如招聘、寻物、公告等&#xff0c;同时也可以浏览和搜索…...

Windows定时任务执行脚本

场景&#xff1a;由于网络波动原因导致云数据库没连接上&#xff0c;从而导致某个流程引擎链接不上数据库从而导致该流程引擎服务挂了&#xff0c;网络恢复后 数据库链接正常&#xff0c;但是该引擎服务还是中止状态。 解决方案&#xff1a;在Windows中新建一个定时任务&#…...

优维“统一开放平台”:开放、开发、集成、客制化

基于丰富完善的产品体系&#xff0c;优维重磅推出了统一开放平台。这款由优维自主设计与研发&#xff0c;集数据开发、能力开放、能力集成、客制化为一体的统一开放平台&#xff0c;具备应用市场、应用开发、连接能力、采控平台、API集市、开发者工具等功能模块&#xff0c;可为…...

ChatGPT新纪元:揭秘GPT-4o的多模态能力

GPT-4o登场 探索ChatGPT的多模态创新 今日凌晨&#xff0c;OpenAI向全球宣布了AI发展的新篇章——GPT-4o&#xff0c;每次OpenAI发布重大更新时&#xff0c;尽管令人兴奋&#xff0c;但也不免使众多初创公司的梦想破灭。 GPT-4o的命名中的“o”象征着“omni”——全能的代表。…...

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …...

(四)SvelteKit教程:调用外部 API 获取数据

&#xff08;四&#xff09;SvelteKit教程&#xff1a;调用 API 我们先按照如下的方式来构建api服务&#xff1a; step 1:npm i json-serverstep 2:在根目录下新建 db.json 文件&#xff0c;内部写入如下内容&#xff1a;{"users": [{"id": 1,"name…...

数据结构-分析期末选择题考点(排序)

何似清歌倚桃李 一炉沈水醉红灯 契子 ✨ 上一期给大家提供了大概会考的题型给老铁们复习的大致思路 这一期还会是一样&#xff0c;我将整理一下排序的题型以及解题方法给你们 由于时间还很多&#xff0c;我就慢慢总结吧&#xff0c;一天一章的样子&#xff0c;明天总结串、后天…...

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数&#xff1a; 函数二 函数三 主函数 运行结果 src&#xff1a; model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征&#xff0c;实现高准确度的身份识别。…...

『SD』AI绘画,不会写提示词怎么办?

提示词 有没有想过&#xff0c;为什么你用 SD 生成的猫是长这样的。 而其他人可以生成这样的猫。 虽然生成的都是猫&#xff0c;但猫与猫之间还是有差距的。 如果你的提示词只是“cat”&#xff0c;那大概率就会出现本文第一张图的那个效果。而如果你加上一些形容词&#xff…...

搭建大型分布式服务(四十二)SpringBoot 无代码侵入实现多Kafka数据源整合插件发布

系列文章目录 文章目录 系列文章目录前言MultiKafkaStarter [V2.2]一、功能特性二、快速开始&#xff08;生产端&#xff09;三、快速开始&#xff08;消费端&#xff09;四、其它特性五、变更记录六、参考文章 前言 在分布式服务的架构演进中&#xff0c;消息队列作为核心组件…...

Python 学习路线及技巧

一、学习路线 1. 基础阶段 ● 学习 Python 的语法基础&#xff0c;如变量、数据类型、运算符、控制流等。 ● 掌握常用的 Python 标准库&#xff0c;如 os、sys、re、datetime 等。 ● 通过编写简单的程序来巩固基础&#xff0c;如计算器、字符串处理等。 2. 进阶阶段 ● 深入…...

计算机网络知识整理笔记

目录 1.对网络协议的分层&#xff1f; 2.TCP/IP和UDP之间的区别&#xff1f; 3.建立TCP连接的三次握手&#xff1f; 4.断开TCP连接的四次挥手&#xff1f; 5.TCP协议如何保证可靠性传输&#xff1f; 6.什么是TCP的拥塞控制&#xff1f; 7.什么是HTTP协议&#xff1f; 8…...

练习 String翻转 注册处理 字符串统计

p493 将字符串中指定部分进行翻转 package chapter;public class reverse {public static void main(String[] args) {String str "abcdef";str reverseMethod(str,0,3);System.out.println(str);}public static String reverseMethod(String str, int start, in…...

linux的常用系统维护命令

1.ps显示某个时间点的程序运行情况 -a &#xff1a;显示所有用户的进程 -u &#xff1a;显示用户名和启动时间 -x &#xff1a;显示 没有控制终端的进程 -e &#xff1a;显示所有进程&#xff0c;包括没有控制终端的进程 -l &#xff1a;长格式显示 -w &#xff1a;宽…...

java:aocache 0.4.0 缓存控制机制

aoocache发布第一个版本0.1.0时&#xff0c;没有考虑到使用aocache的项目对方法缓存的控制需求。 场景 给同事做培训时&#xff0c;同事提到这个需求&#xff0c;他希望能够有方法主动去清理指定方法的缓存&#xff1a; 他的数据是由其他服务启动时提供的&#xff0c;他的方法…...

试析C#编程语言的特点及功能

行步骤&#xff0c;而不必创建新方法。其声明方法是在实例化委托基础上&#xff0c;加一对花括号以代表执行范围&#xff0c;再加一个分号终止语句。 2.3.3 工作原理 C#编译器在“匿名”委托时会自动把执行代码转换成惟一命名类里的惟一命名函数。再对存储代码块的委托进行设…...

Textual Learning2 -- 使用时的小问题

1、出现的问题&#xff1a; 在vscode里面直接运行函数会显示报错&#xff1a; 我尝试在vscode中含textual库的环境下运行&#xff0c;但仍然报错 2、解决方案&#xff1a; 在命令行中运行&#xff1a; 首先按winR&#xff0c;输入cmd打开命令行 或在已经安装的conda环境&a…...

CST--如何在PCB三维模型中自由创建离散端口

在使用CST电磁仿真软件进行PCB的三维建模时&#xff0c;经常会遇到不能自动创建离散端口的问题&#xff0c;原因有很多&#xff0c;比如&#xff1a;缺少元器件封装、开路端口、多端子模型等等&#xff0c;这个时候&#xff0c;很多人会选择手动进行端口创建&#xff0c;但是&a…...

C++中的虚函数表结构框架

一.虚函数表介绍 Virtual Table虚函数表是实现多态的 每个有虚函数的类的实现&#xff0c;都有个指向虚函数的指针表&#xff08;不管是父类还是子类&#xff09; 指向虚表的指针是作为数据成员存在实例对象中 当调用虚函数时&#xff0c;就去查找对象的虚表中指向整顿派生类函…...

【ES】--Elasticsearch的高亮模式

目录 一、高亮策略1、Fast Vector Highlighter(快速向量高亮器)2、Posting Highlighter(帖子高亮器)3、Unified Highlighter(统一高亮器)4、Plain Highlighter(普通高亮器)5、总结二、高亮参数三、高亮案例解析1、words_one配置解析2、words_two配置解析3、words_three…...

使用matlab开发stm32总结,stm32-matlab常见的问题处理以及报错合集

1&#xff0c;问题&#xff1a;本来是好的&#xff0c;突然编译运行报错&#xff0c;说是确少包&#xff0c; 解决方案&#xff1a;重启以后好了 2&#xff0c;有完美的马鞍波&#xff0c;为什么不能够转动呢&#xff1f; 原因是我这里模型的问题&#xff0c;我计算出来的是占…...

落石滑坡监测报警系统:创新保障高速公路安全

​ ​​在现代交通建设中&#xff0c;高速公路的安全性和稳定性至关重要。特别是易发生落石区域&#xff0c;如何有效预防和应对落石滑坡带来的事故成为了一项关键性挑战。为此&#xff0c;落石滑坡监测报警系统应运而生&#xff0c;它通过先进的技术手段&#xff0c;为高速…...

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…...

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成驱动版&#xff0c;新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访…...

vuepress使用简介及个人博客搭建

目录 一、介绍二、环境准备三、安装运行vuepress四、目录结构五、配置文件六、导航栏配置七、导航栏logo八、浏览器图标九、侧边栏配置十、添加 Git 仓库和编辑链接十一、部署到GitHub十二、搭建成功 一、介绍 VuePress 是 Vuejs 官方提供的一个是Vue驱动的静态网站生成器&…...

c#文件读写

1.1读取文件 方法说明​File.ReadAllText(FilePath);​读取指定路径的文件​File.ReadAllText(FilePath, Encoding);​通过指定编码格式来读取指定文件​File.ReadAllBytes();​读取二进制文件&#xff0c;并把内容读取到一个字节数组​File.ReadAllLines();​以行的形式读取文…...

WIFI 企业级认证手段 EAP-TLS介绍

EAP-TLS&#xff08;EAP-Transport Layer Security&#xff09;被认为是WLAN网络里最安全的认证方法&#xff0c;因此被企业广泛采用。本文会针对EAP-TLS的基本原理进行介绍。 在介绍原理之前&#xff0c;先介绍下WLAN网络里认证加密手段涉及到的一些基本概念。 1 802.1x IEE…...

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…...

【Dison夏令营 Day 03】使用 Python 创建我们自己的 21 点游戏

21 点(英文&#xff1a;Blackjack)是一种在赌场玩的纸牌游戏。这种游戏的参与者不是互相竞争&#xff0c;而是与赌场指定的庄家竞争。在本文中&#xff0c;我们将从头开始创建可在终端上玩的玩家与庄家之间的二十一点游戏。 二十一点规则 我们将为从未玩过二十一点的读者提供…...

Workbench密码登录登录失败

Workbench密码登录登录失败操作系统禁用了密码登录方式&#xff0c;会导致使用了正确的用户名和密码仍无法登录 sudo vim /etc/ssh/sshd_config 输入O进入编辑 改完后重启 systemctl restart sshd.service 登录报错 有试了几遍登上了 可能是改完还要等一会儿...

哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收

哈尔滨高校大学智能制造实验室数字孪生可视化系统平台项目的验收&#xff0c;标志着这一技术在教育领域的应用取得了新的突破。项目旨在开发一个数字孪生可视化系统平台&#xff0c;用于哈尔滨高校大学智能制造实验室的设备模拟、监测与数据分析。项目的主要目标包括&#xff1…...

009、MongoDB的分片策略

目录 MongoDB的分片策略:范围分片vs哈希分片 1. 范围分片(Range Sharding) 1.1 工作原理 1.2 优点 1.3 缺点 1.4 研究支持 2. 哈希分片(Hash Sharding) 2.1 工作原理 2.2 优点 2.3 缺点 2.4 研究支持 3. 选择合适的分片策略 4. 实践案例 4.1 电子商务平台 4.2 社…...

go~缓存设计配合singleFlight

一个缓存设计&#xff0c;配合go的singleFlight 最开始的设计如下 添加分布式缓存 上线后分布式缓存上涨的流量并不等于下游下降的流量&#xff0c;而是下游下降的流量 * 2&#xff5e;3 究其原因&#xff0c;就是采用了go的singleFlight&#xff0c;假定请求缓存时长10ms&a…...

多线程引发的安全问题

前言&#x1f440;~ 上一章我们介绍了线程的一些基础知识点&#xff0c;例如创建线程、查看线程、中断线程、等待线程等知识点&#xff0c;今天我们讲解多线程下引发的安全问题 线程安全&#xff08;最复杂也最重要&#xff09; 产生线程安全问题的原因 锁&#xff08;重要…...

Docker部署ETCD 3.5.14(保姆级图文教程)

系列文章目录 Docker部署Nginx 1.21.5&#xff08;保姆级图文教程&#xff09; Docker部署MySQL 8.3.0&#xff08;保姆级图文教程&#xff09; Docker部署ETCD 3.5.14&#xff08;保姆级图文教程&#xff09; 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 ETCD 镜像…...

SerDes介绍以及原语使用介绍(4)ISERDESE2原语仿真

文章目录 前言一、iserdese2_module模块二、oserdese2_module模块三、顶层模块四、仿真结果分析 前言 上文详细介绍了ISERDESE2原语的使用&#xff0c;本文根据仿真对ISERDESE2原语的使用进一步加深印象。在仿真时&#xff0c;与OSERDESE进行回环。 一、iserdese2_module模块…...

Python作用域及其应用

Python的作用域规则决定了变量在代码中的可见性和访问性。全局作用域中定义的变量可以在整个程序中访问&#xff0c;而局部作用域中定义的变量则只能在其被创建的函数或代码块中访问。 全局作用域与局部作用域 全局作用域中的变量通常在程序的顶层定义&#xff0c;可以被整个…...

SQL中常用的内置函数

SQL中常用的内置函数 在SQL&#xff08;结构化查询语言&#xff09;中&#xff0c;有许多内置函数可用于各种数据操作和计算。以下是SQL中常用的函数。 一.字符串操作、数值计算、日期处理 COUNT(): 统计行数。 SELECT COUNT(*) FROM employees;SUM(): 计算数值列的总和。 S…...

LDO芯片手册,实例应用分析

在进行电路设计时LDO是经常用到的&#xff0c;尤其在为芯片&#xff0c;晶振等敏感电路进行供电时应用更多&#xff0c;下面选取一款比较常用的LDO芯片&#xff0c;一起进行更深入的学习。 SGM2036特点简介 SGM2036&#xff0c;圣邦微一款比较常用的LDO芯片手册 可以先大致看…...

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…...

冰箱也安排上了?第二代AIONV内饰发布,会成为爆款么

作为埃安品牌在SUV市场的顶梁柱车型之一,AION V凭借凭借扎实的三电技术和前卫的外观设计、科技感十足的内饰等,获得了消费者的广泛认可。不过面对激烈的纯电动车市场,现款AION V的市场竞争力也在逐渐减退。在这样的局面下,埃安也带来了全新换代的第二代AION V。新车在北京车…...

依米康300249.SZ:长期为百度提供数据中心温控设备和部分微模块的施

:长期为百度提供数据中心温控设备和部分微模块的施工、安装等服务)格隆汇6月14日丨有投资者于投资者互动平台向依米康提问,“百度是公司的重要客户吗?公司与百度的合作主要是在哪方面呢?”,公司回复称,百度一直都是公司重要客户,公司长期为百度提供数据中心温控设备和部分…...

smart汽车焕新登场,精灵1及315.49万元起

2024年4月14日,杭州——备受瞩目的新奢智能纯电汽车品牌smart宣布,在国内市场焕新推出其明星产品系列——smart精灵#1及#3的全新版型,以更亲民的价格和更丰富的配置,满足都市消费者的个性化需求。此次焕新,smart精灵#1以“新奢灵动SUV”的全新定位亮相,推出了灵动标准版、…...

24款捷豹XFL来袭,优惠超12万,车长5102mm,配三种动力可选

相比德系BBA对手,捷豹虽然拥有纯正的英伦运动血统,但捷豹车型在国内仍属偏小众的群体,为了进一步提升市占表现,捷豹也只能通过大幅优惠的方式吸引消费者。最近,2024款捷豹XFL正式上市,新车虽然拥有39.99—48.79万的指导价,但新车亮相后便进行了破10万的优惠政策,目前入…...

性能强硬+配置更新五十铃纯电版D-MAX或将于2025年上市

近日,五十铃在泰国曼谷国际汽车展览会前发布了D-MAX BEV原型车。据悉,五十铃曾计划到2030年在全球推出多款电动车型,涵盖皮卡、SUV、客车等多个细分市场。本次即将登场的D-MAX BEV则是五十铃计划里的首款纯电动皮卡。根据此前公布的信息,D-MAX BEV虽然是一款纯电皮卡,但其…...

CSS浮动详细教学(CSS从入门到精通学习第四天)

css第04天 一、其他样式 1、圆角边框 在 CSS3 中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变圆角了。 border-radius 属性用于设置元素的外边框圆角。 语法&#xff1a; border-radius:length; 参数值可以为数值或百分比的形式如果是正方形&…...