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

typescript学习笔记(全)

1.安装

全局安装

npm i -g typescript

局部安装

npm i typescript

初始化

tsc --init

就会在所在目录下创建出一个tsconfig.json的ts配置文件

2.编译

如果是全局安装

tsc index.ts

就会在同目录下编译出一个index.js文件

如果是局部安装

npx tsc index.ts

3.特性

1.静态类型:

编译时会检查变量和类型是否匹配,如果不匹配,编译不会通过

比如

let name:string = '王惊涛'

可以编译通过

let name:number = '王惊涛'

就会编译报错

2.类型推断:

ts会根据值进行类型推断

let name = '王惊涛'

ts编译器就会自动判断这个类型为string

下面的操作,就属于错误操作

let name = '王惊涛'
name = true

3.接口:

通过interface关键字定义接口,例如


interface interface_test_1{name:stringage:numberlove:Function
}
let interface_test_1:interface_test_1 ={  name:'wjt',age:29,love:()=>'game',
}

4.类型别名:

使用type关键字可以定义类型别名,可以定义多个类型,方便重复使用

type result_type = string | boolean
let result1:result_type = '成功'
let result2:result_type = false

5.枚举:

使用enum关键字命令一组常量,提高代码可读性

enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT"
}let dir: Direction = Direction.Left;
console.log(dir); // 输出: "LEFT"

6.元组:

元组用于定义固定数量和类型的数组。比如2d坐标,固定是两个数字值,代表x和y

let position:[number,number] = [1,1]

7.访问修饰符

在class类中定义了public(公共),private(私有),protected(受保护)修饰符,用于控制属性或方法的可见性,支持更好的封装

class Person {private name: string;protected age: number;public constructor(name: string, age: number) {this.name = name;this.age = age;}
}

8.抽象类

使用abstract定义抽象类,抽象类不能直接实例化,需要由子类进行实例化

abstract class Game {abstract desc(): void; // 抽象方法
}class Moba extends Game { // 继承desc() {console.log('moba类型是推塔游戏');}
}let Lol = new Moba(); // 实例化英雄联盟
Lol.desc(); // 调用 desc 方法

9.泛型:

泛型是参数化类型,定义一个类型参数,代表某种固定类型。如下的示例中,T就代表了传入的number

function addNum<T>(value: T): T {return value+1;
}let num = addNum<number>(1);
console.log(num) //2

10.命名空间:

ts中的导入与导出和ES6模块系统一样,并且还有Namespace命名空间

utils.ts中导出函数

export function addNum(a:number,b:number):number{return a+b
}

app.ts

import {addNum} from './utils.ts'
addNum(1,2)

11.类型守卫:

使用typeof检查类型

function resultFilter(result:string | boolean){if(typeof result === 'string'){console.log('字符串类型)}else{console.log('布尔类型')}
}

12.可选链和空值合并运算符

可选链?.和空值合并运算符??都可以做到代码中应对undfined和null值的处理

let user = { name: "王惊涛", address: { city: "北京" } };
console.log(user?.address?.city); // 如果 address 存在则输出 city,否则返回 undefinedlet value = null;
console.log(value ?? "default"); // 如果 value 为 null 或 undefined,则返回 "default"

13.类型兼容器和工具类型

TypeScript 提供了一些工具类型,如 PartialPickReadonlyRecord 等,这些类型可以帮助生成新的类型,简化类型定义。

interface Person {name: string;age: number;love: string
}let wjt: Partial<Person> = { name:'王惊涛',age:29 }; // 可选属性

4.ts基础类型

归纳

类型描述示例
string文本let name:string = ‘王惊涛’
number数字类型let age:number = 29
let num:number = 2.8
boolean布尔值let gender:boolean = true
array相同类型的元素数组let arr:string[] = [‘王惊涛’,‘小马’]
tuple元组,已知类型和固定长度let position:[string,number,number] = [‘北京’,1,1]
enum命名常量enum Game{LOL, CF, DNF }
let loveGame:Game = Game.LOL
any任意类型,不限制let result:any = true
result = ‘王惊涛’
void无返回值(一般用于函数)function play():viod{ console.log(‘打联盟’) }
null空值let empty:null = null
undefined未定义let value:undefined = undefined
never不会有返回值function error():never { throw new Error(‘error’) }
object非原始类型let wjt:object = {name:‘王惊涛’,age:29}
union联合类型let result:string I number = ‘success’
unknow不确定类型let value:unknow = ‘王惊涛’

null 和 undefined 是所有类型的子类型

布尔类型

//布尔值
let bool_1:boolean = false
console.log(bool_1,'bool_1')

数字类型

//数字
let num_1:number = 6  //十进制
let num_2:number = 0xf00d //十六进制
let num_3:number = 0b1010 //二进制
let num_4:number = 0o744 //八进制
console.log(num_1,num_2,num_3,num_4)

字符串

//字符串
let str_1:string = '字符串'
let str_2:string = `模板字符串`
console.log(str_1,str_2)

数组

let arr_1 : number[] = [1,2,3]
let arr_2 : Array<number> = [2,3,4]
let arr_3 : string[] = ['a','b','c']
let arr_4 : Array<string> = ['b','c','d']
console.log(arr_1,'arr_1')
console.log(arr_2,'arr_2')
console.log(arr_3,'arr_3')
console.log(arr_4,'arr_4')

元组Tuple

let tuple_1:[string,number,boolean] = ['a',1,true]
// tuple_1 = [1,'a',false]  //error
tuple_1 = ['b',2,false]
console.log(tuple_1,'tuple_1')

枚举

enum Color{Red="red",Green=2,Blue=3}
let c_1 : Color = Color.Green
console.log(c_1,'c_1')
let colorName : string = Color[2]
console.log(colorName,'colorName')

任意类型

let any_val1 : any = '任意值'
let any_val2 : any = ['1',2,3]
any_val1 = {name:'any_obj'}
any_val2 = null
console.log(any_val1,any_val2)

Void类型

function fn_1():void{console.log('I`m a funciton')
}
let void_val1:void = null
void_val1 = undefined
// void_val1 = '字符串'  //error

null和undefined类型

let null_1 : null = null
let undefined_1: undefined = undefined
// null_1 = '哈哈哈' //error

Never类型

function errorFn_1():never{throw new Error('哈哈哈')// return '哈哈哈'  error
}
function neverFn_1():never{while (true){}
}

object类型

declare function create(obj:object | null) :void
create({val:111})
create(null)
// create(number) //error
//数组
let arr_1 : number[] = [1,2,3]
let arr_2 : Array<number> = [2,3,4]
let arr_3 : string[] = ['a','b','c']
let arr_4 : Array<string> = ['b','c','d']
console.log(arr_1,'arr_1')
console.log(arr_2,'arr_2')
console.log(arr_3,'arr_3')
console.log(arr_4,'arr_4')//元组Tuple
let tuple_1:[string,number,boolean] = ['a',1,true]
// tuple_1 = [1,'a',false]  //error
tuple_1 = ['b',2,false]
console.log(tuple_1,'tuple_1')//枚举
enum Color{Red="red",Green=2,Blue=3}
let c_1 : Color = Color.Green
console.log(c_1,'c_1')
let colorName : string = Color[2]
console.log(colorName,'colorName')//任意类型
let any_val1 : any = '任意值'
let any_val2 : any = ['1',2,3]
any_val1 = {name:'any_obj'}
any_val2 = null
console.log(any_val1,any_val2)//Void类型
function fn_1():void{console.log('I`m a funciton')
}
let void_val1:void = null
void_val1 = undefined
// void_val1 = '字符串'  //error// null和undefined类型
let null_1 : null = null
let undefined_1: undefined = undefined
// null_1 = '哈哈哈' //error//Never类型
function errorFn_1():never{throw new Error('哈哈哈')// return '哈哈哈'  error
}
function neverFn_1():never{while (true){}
}//object类型
//非原始类型
declare function create(obj:object | null) :void
create({val:111})
create(null)
// create(number) //error//类型断言
let val_dy : any = '要被断言类型的值'
// let length_1 : number = (<string>val_dy).length
let length_1 : number = (val_dy as string).length
let arr_dy :any[] = ['哈哈哈','呵呵呵',(()=>1+'2')()]
let val_2 : string = (<string>arr_dy[2])

5.函数

函数定义类型

// function(参数:类型):返回值类型{}
function fun_test_1(num1:number,num2:number):number{return num1+num2
}
console.log(fun_test_1(1,2),'fun_test_1调用')function fun_test_2(name:string,age:number):void{console.log(`我是${name},我今年${age}`)
}
fun_test_2('wjt',28)

完整写法

// let 函数名:(参数:类型) => 返回值类型 = 函数体
let fun_test_3:(name:string,age:number) => object = function(name:string,age:number):object{return {name,age}
}
console.log(fun_test_3('wjt',29),'fun_test_3完整写法调用')

推断类型

let fun_test_4 = (num:number,str:string)=>{return num+str
}
console.log(fun_test_4(56,'个民族'),'自动推导返回类型')

可选参数

ts中形参必须对应有实参,如果用?,可以让该参数变为可选参数,默认是undefined

// function fun_test_5(name:string,age:number){
//     console.log(name,age)
// }
// fun_test_5('wjt') //errorfunction fun_test_5(name:string,age?:number){console.log(name,age,'fun_test_5函数调用')
}
fun_test_5('wjt')

默认参数

function fun_test_6(name:string,age = 28){console.log(name,age,'fun_test_6函数调用')
}
fun_test_6('wjt')

剩余参数

function fun_test_7(firstParam:string,...otherParam:any[]){console.log(firstParam,'第一个参数')console.log(otherParam,'其余参数')
}
fun_test_7('wjt',28,()=>'game',{love:'study'})

6.interface(接口)

基础使用

interface interface_test_1{name:stringage:numberlove:Function
}
let interface_test_1:interface_test_1 ={   //属性多了对不上name:'wjt',age:29,love:()=>'game',// work:'coder'  //error
}// let interface_test_2:interface_test ={   //error  属性少了对不上
//     name:'mashi',
// }
console.log(interface_test_1,'interface_test_1')

可选属性

interface interface_test_2{name:stringwork?:boolean   //写不写都行price:number
}
let wjt_1:interface_test_2 = {name:'wjt',work:true,price:24000
}
let mashi_1:interface_test_2 ={name:'mashi',price:10000
}
console.log(wjt_1,'wjt_1')
console.log(mashi_1,'mashi_1')interface person_2{
name?:string
age?:number
}let person_2:object = {name:'wjt',age:'28'}  //这里age字符串也没有报错
let getWife =(person_2:person_2):{name:string,age:number}=>{let wife:person_1= {name:'null',age:0,love:'wjt'}if(person_2.name){wife.name = 'mashi'}if(person_2.age){wife.age = 29  }return wife
}
console.log(getWife(person_2))

任意属性名和任意属性值

interface interface_test_3{name:string,age?:number,[propName:string]:any  //任意属性名和任意属性值
}
let interface_test_3:interface_test_3= {name:'wjt',work:'coder',love:()=>'game'
}

函数接口

interface interface_fun_1{(obj:object):object
}
interface fun_obj_1{name:stringage:numberwork:string// [propName:string]:any
}
let fun_obj_1:fun_obj_1 = {name:'wjt',age:28,work:'js-coder'
} let interface_fun_1:interface_fun_1 = (obj)=>{return Object.assign({val:1},obj)
}
interface_fun_1(fun_obj_1)

数组接口

interface interface_obj_arr_1{[index:number]:objectlength:number
}
let obj_arr_1 :interface_obj_arr_1 = [{name:'wjt'},{name:'xm'}
]
console.log(obj_arr_1,'obj_arr_1')

类接口

interface interface_class_1{class_fun_1:Functionclass_var_1:stringclass_var_2:number
}
class Class_1 implements interface_class_1{constructor(){}class_fun_1 : ()=>{}class_var_1:'字符串'class_var_2:0}
let class_shili_1 = new Class_1()
console.log(class_shili_1,'class_shili_1')

继承接口


interface extends_1{name:string
}
interface extends_2 extends extends_1{age:number
}
interface extends_3 extends extends_1,extends_2{love:Function
}
let extends_var_1 : extends_1 = {name:'wjt'}
let extends_var_2 : extends_2 = {name:'wjt',age:28}
let extends_var_3 : extends_3 = {name:'wjt',age:28,love:()=>'game'}

混合类型(函数对象)

interface interface_mix_1{(start:number):stringperson_name:stringage:numberlove:Function
}
function interface_mix_fun():interface_mix_1{let obj_fun = <interface_mix_1>function(start:number){console.log(start,'传入了值')}obj_fun.person_name = 'wjt'obj_fun.age = 28obj_fun.love = ()=>{console.log('打游戏')}return obj_fun
}
let obj_fun_1 = interface_mix_fun()
obj_fun_1(1)
console.log(obj_fun_1,'函数对象')
console.log(obj_fun_1.person_name,'函数对象名字')
console.log(obj_fun_1.age,'函数对象年龄')
console.log(obj_fun_1.love,'函数对象调用love方法')

接口继承类

class Class_2{name:string
}
interface interfaceAndClass extends Class_2{age:number
}
let info:interfaceAndClass = {name:'wjt',age:28}
console.log(info,'info')

7.class(类)

修饰符public

public代表默认公开,可以在任何地方被访问

class Class_1{public person_name:stringpublic constructor(name:string){this.person_name = name}public love(val){console.log(`我喜欢${val}`)}
}
let class_var_1 = new Class_1('wjt1')
console.log(class_var_1,'class_var_1')
console.log(class_var_1.person_name,'class_var_1的person_name名称')

修饰符private

private代表变量私有,只能被其定义的类所访问

class Class_2{private person_name:stringconstructor(name:string){this.person_name = name}
}
let class_var_2 = new Class_2('wjt2')
console.log(class_var_2,'class_var_2')
// console.log(class_var_2.person_name)  //error

修饰符protected

protected代表受保护,只可以被自身和子类所访问

class Class_3{protected person_name:stringconstructor(name:string){this.person_name = name}
}
class Class_4 extends Class_3{private self_var:stringconstructor(name:string,self_var:string){super(name)this.self_var = self_var}public love(val){return '我喜欢'+val}
}
let class_var_4 = new Class_4('wjt4','自定义数据')
console.log(class_var_4,'class_var_4')
// console.log(class_var_4.person_name) error
// console.log(class_var_4.self_var)  error
console.log(class_var_4.love('打游戏'))

readonly只读

class Class_5{readonly person_name:stringage:numberconstructor(name:string,age:number){this.person_name = namethis.age = age}
}
let class_var_5 = new Class_5('wjt5',28)
console.log(class_var_5,'class_var_5')
class_var_5.age = 29
// class_var_5.person_name = 'wjt' //error

类当接口使用

把类当interface一样去使用

class Class_10{person_name:stringage:number
}interface interfaceWithClass extends Class_10{love:Function
}let person_wjt:interfaceWithClass = {person_name:'wjt',age:28,love:()=>'game'}
console.log(person_wjt,'person_wjt')

8.泛型

允许在定义函数、类、接口等时使用占位符来表示类型,而不是具体的类型。

基础用法:泛型函数

function genericity_fun1<T>(name:T):T{return name
}

调用

// 写法1
let result_1 =  genericity_fun1<string>('wjt')
//写法2:自动推导类型
let result_2 = genericity_fun1('wjt')

约定俗称的一些标识符

T 一般代表Type(类型)

function fun<T>(arg: T): T {return arg;
}

K ,V一般代表Key(键)和Value(值)

interface KeyValueObj<K, V> {key: K;value: V;
}

E 一般标识数组元素的泛型类型参数

function numArr<E>(arr: E[]): void {arr.forEach(item => console.log(item));
}

R 一般代表函数返回值的泛型类型参数

function hasResultFun<R>(value: R): R {return value;
}

泛型接口

// 基本语法
interface Person<T, U> {name: T;age: U;
}// 使用泛型接口
let wjt: Person<string, number> = { name: "王惊涛", second: 29 };
console.log(wjt);

泛型类

class Genericity_Class<T>{initVal:TaddFun:(x:T,y:T) => T
}//传入数字类型
let number_result_1 = new Genericity_Class<number>()
number_result_1.initVal = 0
number_result_1.addFun = function(x,y){return x+y}
console.log(number_result_1.addFun(1,2),'number_result_1.addFun')//传入字符串类型
let string_result_1 = new Genericity_Class<string>()
string_result_1.initVal = '初始化字符'
string_result_1.addFun = function(x,y){return x+y}
console.log(string_result_1.addFun('我是','字符串'))

泛型约束

使用T extends interfaceXXX进行约束

interface genericity_constraint1{length:number
}
function genericity_constraint2<T extends genericity_constraint1>(arr:T):T{console.log(arr.length,'genericity_constraint2的length')return arr
}
genericity_constraint2(['wjt','mashi'])

泛型默认值

function defaultValue<T = string>(arg: T): T {return arg;
}// 使用带默认值的泛型函数
let result1 = defaultValue("王惊涛"); // 推断为 string 类型
let result2 = defaultValue(29);      // 推断为 number 类型

9.联合类型与交叉类型

联合类型

使用|连接两种类型: 类型1 | 类型2,该变量可设置为这两种类型

let age:number | string = '29'
age = 29

函数参数也可以这样设置

const getAge = (age:number | string): number | string=>{return age
}

数组也是可以的

let arr:number[]|string[] = [1,2,3]
arr = ['1','2','3'] 

交叉类型

使用&连接两种类型,可以将这两种类型合并

//交叉类型
interface prop1{name:stringage:number
}
interface prop2{love:()=>string
}const function2 = (personInfo:prop1 & prop2)=>{console.log(personInfo)
}
function2({name:'wjt',age:29,love:()=>'jscoder'})

10.类型推导与类型断言

类型推导

//默认推导为number类型
let age = 18//默认推导为字符串类型
let name = '王惊涛'//默认推导为布尔类型
let gander = true//函数返回值类型推导
function desc(name:string,age:number){return `我是${name},今年${age}`  //返回值推断为字符串
}
let wjtDesc = desc(name,age)  //类型为字符串

类型断言

当编辑器无法断定一个变量的类型,但是开发者知道,就可以手动指定一个变量的类型,有两种写法

let name = '王惊涛';// 写法1: 尖括号语法:   <类型>变量 (不推荐)
let nameLength1: number = (<string>name).length;// 写法2: as语法:  变量 as 类型 (推荐)
let nameLength2: number = (name as string).length;// 定义接口
interface Person {name: string;age: number;
}// 动态类型
let wjt: any = { name, age: 29 };// 开发者可以断言 wjt 类型为 Person 类型,wjt_copy 也就是 Person 类型
let wjt_copy: Person = wjt as Person;

对比

特性类型推导类型断言
触发方式由编译器自动推断由开发者手动指定
使用场景编译器可以准确推断类型时编译器无法推断类型或需要覆盖推断时
安全性类型安全,编译器会验证存在风险,开发者需确保断言类型正确
语法无需显式语法使用 <Type>as Type

11.类型别名

type可以定义类型别名,功能还是很强大的

基础类型

不过这个意义一般不大

type stringType = string
let name:stringType = '王惊涛'

联合类型

设置了固定的值,这个变量的值智只能从设置的值里拿,如果赋值一个没有设置的值,会报错

type genderType = "男" | "女" 
let gender:genderType = "太监"  //error,不好意思,大清之后无太监

对象类型

type Person = {name:stringage:numbergender:boolean
}let wjt:Person = {name:'王惊涛',age:29,gender:true}

函数类型

type addNumType = (x:number,y:number) => numberlet addNum :addNumType = (x,y)=>x+y
let num =  addNum(1,1)

元组类型

type Position = [number,number]
let position:Position = [1,1]

type和interface的区别

虽然都可以实现类型定义

type Person1{name:stringage:numberhas:{xxx:stringyyy:string}
}interface Person2{name:stringage:numberhas:{xxx:stringyyy:string}
}

不过interface可以实现继承和扩展,而Type做不到

interface Man extends Person {nanFun:Function
}

相关文章:

typescript学习笔记(全)

1.安装 全局安装 npm i -g typescript局部安装 npm i typescript初始化 tsc --init就会在所在目录下创建出一个tsconfig.json的ts配置文件 2.编译 如果是全局安装 tsc index.ts就会在同目录下编译出一个index.js文件 如果是局部安装 npx tsc index.ts3.特性 1.静态类…...

centos挂载新的硬盘

如果要将 nvme0n1 挂载到 /data 目录&#xff08;而不是 /&#xff09;&#xff0c;操作会更简单&#xff0c;无需迁移系统文件。以下是详细步骤&#xff1a; 1. 检查磁盘情况 lsblk输出&#xff1a; NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 …...

​​客户案例 | 西昊智能家具:日事清【目标】【日程】【项目】助力高效OKR管理

随着社会现代化、科技化的发展&#xff0c;人们越来越青睐智能化的家具产品&#xff0c;以此来提升家居的安全性、便利性与舒适性。目前&#xff0c;智能家具的行业规模正在不断扩张&#xff0c;产业也逐渐步入高质量增长模式。面对繁荣的市场前景&#xff0c;西昊智能家具与日…...

16.磁环在EMC设计中的选型与运用

磁环在EMC设计中的选型与运用 1. 磁环选型的参数和注意事项2. 磁环的选型方法3. 非晶磁环 1. 磁环选型的参数和注意事项 &#xff08;1&#xff09;损耗电阻R(f)和L(f)是频率的函数&#xff0c;因此IL也是频率的函数&#xff1b; &#xff08;2&#xff09;fL段&#xff0c;R(f…...

oralce 查询未提交事务和终止提交事务

查询提交记录 SELECT s.sid,s.serial#,s.username,s.status,t.start_time,t.used_ublk,t.log_io,t.phy_io FROM v$session sJOIN v$transaction t ON s.saddr t.ses_addr; 查到的记录如下&#xff1a; 如果要终止第一次提交&#xff0c;如下操作 ALTER SYSTEM KILL SESSION…...

智能小助手部署 Win10 + ollama的Deepseek + CentOS+ maxKB

一、适用场景 1、企业内部知识管理 &#xff08;1&#xff09;快速查询政策与流程文档&#xff1a; 员工通过自然语言提问&#xff0c;MaxKB 能迅速定位相关文档并给出准确答案&#xff0c;减少人工检索成本&#xff0c;提升企业内部知识获取的效率。 &#xff08;2&#xff0…...

CentOS 7 系统中,防火墙要怎么使用?

在 CentOS 7 系统中&#xff0c;默认有两个防火墙管理工具&#xff1a; firewalld&#xff08;默认的动态防火墙&#xff0c;基于 D-Bus 管理&#xff09; iptables&#xff08;传统的静态防火墙&#xff0c;底层由 netfilter 提供支持&#xff09; 是否需要关闭这两个防火墙…...

网页版 deepseek 对话问答内容导出为 PDF 文件和 Word 文件的浏览器插件下载安装和使用说明

文章目录 网页版 deepseek 浏览器扩展应用程序插件1. 预览效果2. 功能介绍3. 浏览器扩展应用程序下载3.1. 下载方式13.2. 下载方式24. 安装教程4.1. Chrome 浏览器安装步骤4.2. Edge 浏览器安装步骤5. 使用说明网页版 deepseek 浏览器扩展应用程序插件 1. 预览效果 预览效果 导…...

MySQL 报错解析:SQLSyntaxErrorException caused by extra comma before FROM

一、遇到的错误 在日常开发中&#xff0c;尤其是使用 MyBatis 等 ORM 框架操作 SQL 时&#xff0c;我们经常会遇到类似下面的错误。 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that co…...

高光谱相机在生物医学中的应用:病理分析、智慧中医与成分分析

高光谱成像技术&#xff08;Hyperspectral Imaging, HSI&#xff09;通过捕捉物质的连续光谱信息与空间信息&#xff0c;形成“光谱立方体”&#xff0c;能够揭示传统成像技术无法获取的分子级特征。作为国内光谱技术领域的领军企业&#xff0c;深圳市中达瑞和科技有限公司依托…...

2025 年“泰迪杯”数据挖掘挑战赛B题——基于穿戴装备的身体活动监测问题分析

摘要 本文聚焦于基于穿戴设备采集的加速度计数据,深入研究志愿者在日常活动中的行为特征,构建了多个数学建模框架,实现从身体活动监测、能耗预测、睡眠阶段识别到久坐预警等多个目标。我们依托于多源数据融合与机器学习模型,对人体活动状态进行识别与分析,为健康管理、行…...

10.接口而非实现编程

10.接口而非实现编程 目录介绍 01.接口编程原则 1.1 接口指导思想 02.如何理解接口 2.1 重点搞清楚接口2.2 抽象的思想 03.来看一个案例 3.1 图片存储的案例3.2 业务拓展问题3.3 代码演变设计思想3.4 重构后的代码 04.定义接口的场景 4.1 要有接口意识4.2 接口具体的场景4.3 …...

基于大语言模型的AI智能体开发:构建具备工具使用能力的智能助手

本文将结合大语言模型&#xff08;LLM&#xff09;与工具调用能力&#xff0c;构建新一代AI智能体系统。通过ReAct框架实现智能思考-行动循环&#xff0c;集成网络搜索、计算器、API调用等外部工具&#xff0c;并基于LangChain实现可扩展的智能体架构。 一、新一代AI智能体技术…...

DS B/B+/B*树及其应用(21)

文章目录 前言一、常见的搜索结构内查找外查找 二、B树的概念三、B树的插入分析四、B树的插入实现B树的节点设计B树的查找B树插入Key / Key & Value的过程B树的完整插入代码B树的中序遍历B树的删除B树的性能分析 五、B树六、B*树七、B树系列总结及其应用总结 前言 我们计算…...

04-stm32的标准外设库

一、概述 1、STM32标准外设库&#xff08;Standard Peripheral Library&#xff09;是STMicroelectronics为STM32系列微控制器提供的一个软件库&#xff0c;它提供了一组API函数来简化对STM32微控制器硬件的访问。这个库包含了对各种外设&#xff08;如GPIO、USART、SPI、I2C等…...

ORACLE RAC环境使用ASM机制零宕机时间更换存储的实践

ORACLE RAC使用存储&#xff0c;随时系统的发展&#xff0c;磁盘空间以及存储的老化、更换是一个典型的动作&#xff1b;基于ASM数据自动均衡分配到各个磁盘LUN的特性&#xff0c;可以使用此方式进行在线的迁移&#xff0c;ORACLE MOS上有一个文档&#xff1a;中文版&#xff1…...

03_JavaScript

文章目录 一、概述1.1、JavaScript简介1.2、JavaScript组成部分1.3、为什么要学习JavaScript1.4、学习的目的1.5、JavaScript与Java的关系 二、使用位置及运行说明2.1、使用位置2.2、如何运行 三、JavaScript基础语法3.1、变量3.2、运算符3.3、控制流程3.3.1、分支结构3.3.2、循…...

Kafka消息可视化工具Offset Explorer

参考文献 Kafka消息可视化工具&#xff1a;Offset Explorer&#xff08;原名kafka Tool&#xff09;的使用方法【转】 - paul_hch - 博客园 https://zhuanlan.zhihu.com/p/722232008 正文 官网下载地址为Offset Explorer 双击offsetexplorer_64bit.exe 安装 双击 使用kafka…...

AXP2101入门

目录 核心功能与特性封装与配置安全与可靠性 AXP2101 是一款由全志公司开发的单电池 NVDC 电源管理集成电路&#xff08;PMIC&#xff09;&#xff0c;专为锂离子/锂聚合物单电池应用设计&#xff0c;适用于需要多通道电源输出的设备。 核心功能与特性 1.输入与充电管理 输入…...

Bytebase 取得 SOC 2 Type 1 认证

我们很高兴地宣布&#xff0c;Bytebase 已成功取得 SOC 2 Type 1 认证&#xff0c;印证了我们在数据库 DevSecOps 平台始终以最高标准保障安全性、可用性和保密性的承诺。 为了实现并维持 SOC 2 合规性&#xff0c;我们与 Vanta 合作进行自动安全监控和合规性验证。审计由独立…...

反爬系列 IP 限制与频率封禁应对指南

在数据采集领域&#xff0c;IP 限制与频率封禁是反爬机制中最常见的防御手段。随着网站安全策略的升级&#xff0c;单靠传统爬虫技术已难以应对高强度的检测。本文将从反爬机制解析、实战应对策略两个维度&#xff0c;系统讲解如何突破 IP 限制与频率封禁。 一、反爬机制解析 …...

Java的进阶学习

注解 Java注解(Annotation)又称为Java标注&#xff0c;是JDK5.0引入的一种注释机制&#xff0c;可以用在类、方法、变量、参数成员上&#xff0c;在编译期间&#xff0c;会被编译到字节码文件中&#xff0c;运行时通过反射机制获得注解内容进行解析。 内置注解 Java语言已经定…...

从零开始学习SLAM|技术路线

概念 视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;系统中&#xff0c;整个过程通常分为 前端 和 后端 两个主要部分。前端处理的是从传感器数据&#xff08;如相机图像、激光雷达等&#xff09;中提取和处理信息&#xff0c;用于实时定位和建图&am…...

vue3:十一、主页面布局(修改顶部导航栏样式-右侧:用户信息+退出登录+全屏显示)

一、效果 完成效果,增加顶部导航栏,右侧用户信息(其中个人中心需要后续进行页面开发,这里只写了退出登录功能),以及全屏功能 二、搭建并引入右侧组件 将右侧内容封装到单独的组件,直接引入(像左侧导航条等内容也是可以做成这种形式) 1、新建右侧组件的页面 在layout中…...

车载客流记录仪简介

一、产品概述 车载客流记录仪技术是采用智能视频分析算法&#xff0c;通过人体形态特征&#xff08;头部和肩部&#xff09;及上下车的运动规律研判&#xff0c;在设定区域内分析出上下车人数数量&#xff0c;实现相关人数数据的统计和记录。能够为公共交通企业、公共交通管理…...

2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发

2025新版懒人精灵零基础安装调试lua基础UI设计交互常用方法封装项目实战项目打包安装板块-视频教程(初学者必修课) 1.懒人精灵核心API基础和lua基础视频教程&#xff1a;https://www.bilibili.com/video/BV1Vm9kYJEfM/ 其它板块教程(包含&#xff1a;对接AI、实战、插件、UI、…...

从 Java 到 Kotlin:在现有项目中迁移的最佳实践!

全文目录&#xff1a; 开篇语 1. 为什么选择 Kotlin&#xff1f;1.1 Kotlin 与 Java 的兼容性1.2 Kotlin 的优势1.3 Kotlin 的挑战 2. Kotlin 迁移最佳实践2.1 渐进式迁移2.1.1 步骤一&#xff1a;将 Kotlin 集成到现有的构建工具中2.1.2 步骤二&#xff1a;逐步迁移2.1.3 步骤…...

矩阵运营的限流问题本质上是平台与创作者之间的流量博弈

矩阵运营的限流问题本质上是平台与创作者之间的流量博弈&#xff0c;要系统性解决这一问题&#xff0c;需从技术规避、内容优化、运营策略三个维度构建防御体系。以下结合平台算法逻辑与实战案例&#xff0c;深度解析限流成因及破解之道&#xff1a; 一、技术层&#xff1a;突…...

一种Spark程序运行指标的采集与任务诊断实现方式

一种Spark程序运行指标的采集与任务诊断实现方式 编写时间:2023年8月2日 第一次校准时间:2023年8月2日 文章目录 一种Spark程序运行指标的采集与任务诊断实现方式数据链路采集器的类图CustomSparkListener采集的指标task相关stage相关Job相关Executors相关诊断诊断分类调度阶…...

Gazebo 仿真环境系列教程(一):环境安装与基础使用

文章目录 一、版本说明与技术背景1.1 Gazebo 版本分支1.2 版本选择建议 二、系统环境准备2.1 硬件要求2.2 软件依赖 三、Gazebo Garden 安装流程3.1 添加官方软件源3.2 执行安装命令3.3 环境验证 四、Gazebo Classic 安装方法4.1 添加软件仓库4.2 安装核心组件4.3 验证安装 五、…...

Nginx 中间件

Nginx&#xff08;发音为 "engine-x"&#xff09;是一款开源的高性能 HTTP 服务器和反向代理服务器&#xff0c;最初由 Igor Sysoev 开发。 它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名&#xff0c;广泛应用于全球的 Web 服务架构中。 作为中间件&#…...

记录学习的第三十一天

今天只做了一道每日一题。 说实话&#xff0c;根本不会做呀&#xff0c;该怎么办&#xff1f; 以下是我看了题解之后的思路(适合新手&#xff09;&#xff1a; 1.首先肯定是要求出整个数组的不同数字有多少个的使用set来操作 2.右指针开始进入窗口&#xff0c;把元素放进哈希…...

Framework.jar里的类无法通过Class.forName反射某个类的问题排查

1&#xff0c;背景 我们想要在system_server进程里扩展一些我们自己的功能。 考虑到解耦和编译依赖的问题&#xff0c;我们用PRODUCT_SYSTEM_SERVER_JARS预置我们的类&#xff0c;然后用反射jar里面的类的方式来实现代码引用。 2&#xff0c;遇到的问题 在SystemServer.jav…...

架构-信息安全技术基础知识

一、信息安全基础 1. 信息安全的5个基本要素&#xff08;重点&#xff09; 机密性&#xff1a;确保信息不泄露给未授权的人或程序。 ▶ 举例&#xff1a;银行用户的账户密码必须保密&#xff0c;防止黑客窃取。完整性&#xff1a;保证信息不被非法修改&#xff0c;保持准确和…...

项目班——0419——chrono时间库

1、写日志需要时间库 C11时间库chrono源自于boost 1.时间间隔 duration 2.时间点 timepoint 3.时钟 clock 系统时钟system_clock&#xff0c;稳定时钟steady_clock&#xff0c;高精度时钟high_resolution_clock 例子 1、休眠100毫秒 2、输出当前时间 获取当前时间戳 s…...

Unity后处理全解析:从入门到优化

在游戏开发的世界里,Unity作为一款强大的游戏引擎,为开发者们提供了丰富的功能和工具。其中,后处理(Post-Processing)技术是提升游戏画面质量和视觉效果的重要手段之一。今天,我们就来深入探讨一下Unity后处理的相关内容,包括基本概念、使用说明、常见效果、优化技巧以及…...

得物业务参数配置中心架构综述

一、背景 现状与痛点 在目前互联网飞速发展的今天&#xff0c;企业对用人的要求越来越高&#xff0c;尤其是后端的开发同学大部分精力都要投入在对复杂需求的处理&#xff0c;以及代码架构&#xff0c;稳定性的工作中&#xff0c;在对比下&#xff0c;简单且重复的CRUD就显得…...

针对密码学的 EM 侧信道攻击

基于电磁的侧信道攻击是非侵入式的,这意味着攻击者无需物理接触设备即可窃取信息。我们将了解这些电磁侧信道攻击的工作原理。 我们之前介绍了侧信道攻击的概念:它们是什么,以及为什么它们会成为重大的硬件安全威胁。在众多形式的侧信道攻击中,最强大的一种是电磁 (EM) 攻…...

el-setup- 修改样式(vue3)

一 第一步 <template><el-steps :active"activeStep" align-center><el-stepv-for"item in stepData":key"item.value":class"{ currentStep: activeStep item.value }"><template #icon><div class"…...

CPT204 Advanced Obejct-Oriented Programming 高级面向对象编程 Pt.8 排序算法

文章目录 1. 排序算法1.1 冒泡排序&#xff08;Bubble sort&#xff09;1.2 归并排序&#xff08;Merge Sort&#xff09;1.3 快速排序&#xff08;Quick Sort&#xff09;1.4 堆排序&#xff08;Heap Sort&#xff09; 2. 在面向对象编程中终身学习2.1 记录和反思学习过程2.2 …...

【低配置电脑预训练minimind的实践】

低配置电脑预训练minimind的实践 概要 minimind是一个轻量级的LLM大语言模型&#xff0c;项目的初衷是拉低LLM的学习门槛&#xff0c;让每个人都能从理解每一行代码开始&#xff0c; 从零开始亲手训练一个极小的语言模型。对于很多初学者而言&#xff0c;电脑配置仅能够满足日…...

flutter 小知识

FractionallySizedBox组件 ‌FractionallySizedBox‌是Flutter中的一个特殊布局小部件&#xff0c;它允许子组件的尺寸基于父组件的尺寸来计算。这意味着子组件的尺寸是父组件尺寸的一个比例&#xff0c;这使得布局在不同屏幕尺寸下保持一致性‌1。 ListWheelScrollView ‌Lis…...

高性能服务器配置经验指南3——安装服务器可能遇到的问题及解决方法

文章目录 1、重装系统后VScode远程连接失败问题2、XRDP连接黑屏问题1. 打开文件2. 添加配置3. 重启xrdp服务 在完成 服务器基本配置和 深度学习环境准备后&#xff0c;大家应该就可以正常使用服务器了&#xff0c;推荐使用VScode远程连接使用&#xff0c;比较稳定方便&#x…...

Vue实战(08)解决 Vue 项目中路径别名 `@` 在 IDE 中报错无法识别的问题

一、引言 ​ 在 Vue 项目开发过程中&#xff0c;路径别名是一个非常实用的特性&#xff0c;它能够帮助开发者简化文件引用路径&#xff0c;提高代码的可读性和可维护性。其中&#xff0c; 作为一个常见的路径别名&#xff0c;通常被用来指向项目的 src 目录。然而&#xff0c;…...

处理任务“无需等待”:集成RabbitMQ实现异步通信与系统解耦

在前几篇文章中&#xff0c;我们构建的Web应用遵循了一个常见的同步处理模式&#xff1a;用户发出HTTP请求 -> Controller接收 -> Service处理&#xff08;可能涉及数据库操作、调用其他内部方法&#xff09;-> Controller返回HTTP响应。这个流程简单直接&#xff0c;…...

ASP.NET Core 主机模型详解:Host、WebHost与WebApplication的对比与实践【代码之美】

&#x1f380;&#x1f380;&#x1f380;代码之美系列目录&#x1f380;&#x1f380;&#x1f380; 一、C# 命名规则规范 二、C# 代码约定规范 三、C# 参数类型约束 四、浅析 B/S 应用程序体系结构原则 五、浅析 C# Async 和 Await 六、浅析 ASP.NET Core SignalR 双工通信 …...

编译型语言、解释型语言与混合型语言:原理、区别与应用场景详解

编译型语言、解释型语言与混合型语言&#xff1a;原理、区别与应用场景详解 文章目录 编译型语言、解释型语言与混合型语言&#xff1a;原理、区别与应用场景详解引言一、编译型语言1.1 工作原理1.2 典型的编译型语言1.3 优点1.4 缺点 二、解释型语言2.1 工作原理2.2 典型的解释…...

AI工程pytorch小白TorchServe部署模型服务

注意&#xff1a;该博客仅是介绍整体流程和环境部署&#xff0c;不能直接拿来即用(避免公司代码外泄)请理解。并且当前流程是公司notebook运行&本机windows&#xff0c;后面可以使用docker 部署镜像到k8s&#xff0c;敬请期待~ 前提提要&#xff1a;工程要放弃采购的AI平台…...

Ubuntu 一站式部署 RabbitMQ 4 并“彻底”迁移数据目录的终极实践

1 安装前准备 sudo apt update -y sudo apt install -y curl gnupg apt-transport-https lsb-release jq若计划将数据放到新磁盘&#xff08;如 /dev/nvme0n1p1&#xff09;&#xff1a; sudo mkfs.xfs /dev/nvme0n1p1 sudo mkdir /data echo /dev/nvme0n1p1 /data xfs defau…...

华为手机怎么进行音频降噪?音频降噪技巧分享:提升听觉体验

在当今数字化时代&#xff0c;音频质量对于提升用户体验至关重要&#xff0c;无论是在通话、视频录制还是音频文件播放中&#xff0c;清晰的音频都能带来更佳的听觉享受。 而华为手机凭借其强大的音频处理技术&#xff0c;为用户提供了多种音频降噪功能&#xff0c;帮助用户在…...