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

TypeScript进阶(三):断言

文章目录

    • 一、前言
    • 二、类型断言
      • 2.1 利用 as 实现断言
      • 2.2 利用 <> 实现断言
      • 2.3 应用示例
        • 2.3.1 如果 A,B 如果是类并且有继承关系
        • 2.3.2 如果 A,B 如果是类,但没有继承关系
        • 2.3.3 如果 A 是类,B 是接口,并且 A 类实现了 B 接口【implements】,则A 的对象变量可以断言成 B 接口类型,同样 B 接口类型的对象变量也可以断言成A类型 。
        • 2.3.4 如果 A 是类,B 是接口,并且 A 类没有实现 B 接口,则断言关系和第2项的规则完全相同。
        • 2.3.5 如果 A 是类,B 是 type 定义的数据类型
        • 2.3.6 如果 A 是类,B 是 type 定义的数据类型,并且 A 类没有实现 B type定义的数据类型,则断言关系和第2项的规则完全相同。
        • 2.3.7 如果 A 是一个函数上参数变量的联合类型,例如 string |number,那么在函数内部可以断言成 string 或number 类型。
        • 2.3.8 多个类组成的联合类型断言
        • 2.3.9 任何数据类型都可以转换成 any 或 unknown 类型,any 或 unknown 类型也可以转换成任何其他数据类型。
    • 三、非空断言
    • 四、确定赋值断言
    • 五、const 断言
    • 六、拓展阅读

一、前言

TypeScript中,断言是把两种具有重叠关系的数据类型进行相互转换的一种 TS 语法,其可以把其中的一种数据类型转换成另外一种数据类型。类型断言和类型转换产生的效果一样,但语法格式不同。

二、类型断言

2.1 利用 as 实现断言

语法 : 数据 as 类型

const box = document.querySelector('.box')
console.log((box as HTMLDivElement).innerHTML)

2.2 利用 <> 实现断言

语法 : <类型>数据

const box = document.querySelector('.box')
console.log((<HTMLDivElement>box).innerHTML)

这就是对一个数据进行类型断言,也就是在开发的过程中将某一个数据断定为某一个类型,这样就可以直接按照该数据类型去调用属性和方法。

2.3 应用示例

2.3.1 如果 A,B 如果是类并且有继承关系

【 extends 关系】无论 A,B 谁是父类或子类, A 的对象变量可以断言成 B 类型,B 的对象变量可以断言成A类型 。但注意一般在绝大多数场景下都是把父类的对象变量断言成子类。

class People {public myusername!: string;public myage!: number;public address!: stringpublic phone!: stringconstructor() {}eat() {}step() {console.log("People=>step");}
}class Stu extends People {public username!: stringpublic age!: number;public address!: stringconstructor(username: string, age: number, address: string, public phone: string) {super();this.address = address;}study() {}
}let people = new People()//let result = people as Stu;// 类型断言 正确
let result = <Stu>people;// 类型转换 正确
result.study();let stu = new Stu("wangwu", 23, "北京", "123")
let result2 = stu as People;// 正确
2.3.2 如果 A,B 如果是类,但没有继承关系

两个类中的任意一个类的所有 public 实例属性【不包括静态属性】加上所有的 public 实例方法和另一个类的所有 public 实例属性加上所有的 public 实例方法完全相同或是另外一个类的子集,则这两个类可以相互断言,否则这两个类就不能相互断言。

// 类型断言中的不能相互重叠问题:
//   两个类之间断言的规则:
//   两个类中任意一个的属性和方法是另一个类的属性和方法完全相同或子集,则这两个类可以相互断言
//   否则这两个类就不能相互断言class People {constructor(public username: string, public age: number,public address: string) {}
}class Stu {public username!: stringpublic age!: number;public address!: stringpublic phone!:string;constructor(username: string, age: number, address: string) {this.address = address;}
}let people = new People("wangwu", 23, "beijing")
let stuedConvert = people as Stu;
let stu = new Stu("wangwu", 23, "北京")
let peopledConvert = stu as People;
2.3.3 如果 A 是类,B 是接口,并且 A 类实现了 B 接口【implements】,则A 的对象变量可以断言成 B 接口类型,同样 B 接口类型的对象变量也可以断言成A类型 。
interface People {username: string, age: number, address: string, phone: string
}class Stu implements People {public username!: stringpublic age!: number;public address!: stringpublic phone!: stringpublic kk() {}constructor(username: string, age: number, address: string) {this.address = address;}
}let people: People = { username: "wangwu", age: 23, address: "11", phone: "111" }
let result = people as Stu;//正确
let result2 = <Stu>people;// 类型转换 正确let stu = new Stu("wangwu", 23, "北京")
stu as People;// 正确
2.3.4 如果 A 是类,B 是接口,并且 A 类没有实现 B 接口,则断言关系和第2项的规则完全相同。

两个类中的任意一个类的所有 public 实例属性【不包括静态属性】加上所有的 public 实例方法和另一个类的所有 public 实例属性加上所有的 public 实例方法完全相同或是另外一个类的子集,则这两个类可以相互断言,否则这两个类就不能相互断言。

interface People {username: string, age: number, address: string, phone: string
}class Stu {public username!: stringpublic age!: number;public address!: stringpublic phone!: stringpublic kk() {}constructor(username: string, age: number, address: string) {this.address = address;}
}let people: People = { username: "wangwu", age: 23, address: "11", phone: "111" }
let result = people as Stu;//正确let stu = new Stu("wangwu", 23, "北京")
stu as People;// 正确
2.3.5 如果 A 是类,B 是 type 定义的数据类型

type 定义的数据类型是引用数据类型,例如 Array, 对象,不能是基本数据类型,例如 stringnumber,boolean,并且有 A 类实现了 B type 定义的数据类型【 implements】,则 A 的对象变量可以断言成 B type 定义的对象数据类型,同样 B type 定义的对象数据类型的对象变量也可以断言成 A 类型 。

type People = {username: string, age: number, address: string, phone: string
}class Stu implements People {public username!: stringpublic age!: number;public address!: stringpublic phone!: stringconstructor(username: string, age: number, address: string) {this.address = address;}
}let people: People = { username: "wangwu", age: 23, address: "11", phone: "111" }
let result = people as Stu;//正确let stu = new Stu("wangwu", 23, "北京")
stu as People;// 正确
2.3.6 如果 A 是类,B 是 type 定义的数据类型,并且 A 类没有实现 B type定义的数据类型,则断言关系和第2项的规则完全相同。

两个类中的任意一个类的所有 public 实例属性【不包括静态属性】加上所有的 public 实例方法和另一个类的所有 public 实例属性加上所有的 public 实例方法完全相同或是另外一个类的子集,则这两个类可以相互断言,否则这两个类就不能相互断言。

type People = {username: string, age: number, address: string, phone: string
}
class Stu {public username!: stringpublic age!: number;public address!: stringconstructor(username: string, age: number, address: string) {this.address = address;}
}let people: People = { username: "wangwu", age: 23, address: "11", phone: "111" }
let result = people as Stu;//正确let stu = new Stu("wangwu", 23, "北京")
stu as People;// 正确
2.3.7 如果 A 是一个函数上参数变量的联合类型,例如 string |number,那么在函数内部可以断言成 string 或number 类型。
function selfMutiply(one: string | number) {one as number +3;
}
2.3.8 多个类组成的联合类型断言

例如:let vechile: Car | Bus | Trunck。 vechile 可以断言成其中任意一种数据类型。 例如 vechile as Car, vechile as Bus , vechile as Trunck

class Vechile {static count: number = 3;public brand: string;public vechileNo: string;public days: number;public total: number = 0;public deposit: number;constructor(brand_: string, vechileNo_: string, days_: number, deposit_: number) {this.brand = brand_;this.vechileNo = vechileNo_;this.days = days_;this.deposit = deposit_;}public calculateRent() {}payDesposit() {}public safeShow() {}
}class Car extends Vechile {public type: string;constructor(brand_: string, vechileNo_: string, days_: number,deposit_: number, type_: string) {super(brand_, vechileNo_, days_, deposit_);this.type = type_;}public getPriceByType() {}public calculateRent() {}public checkIsWeigui(isOverWeight: boolean) {}
}class Bus extends Vechile {public seatNum: numberconstructor(brand_: string, vechileNo_: string, days_: number,deposit_: number, seatNum_: number) {super(brand_, vechileNo_, days_, deposit_);this.seatNum = seatNum_;}public getPriceBySeatNum() {}public checkIsOverNum(isOverWeight: boolean) {}
}class Truck extends Vechile {ton!: numberconstructor(brand_: string, type_: string,days_: number, deposit_: number, ton_: number) {super(brand_, type_, days_, deposit_);this.ton = ton_;}checkIsOverWeight(isOverWeight: boolean) {}CalRentPrice() {}public calRent() {}public calDesposit() {}
}class Customer {rentVechile(vechile:Bus | Truck | Car) {// 下面进行断言、转换//<Bus>vechile <==等同==> vechile as Bus//vechile as unknown//vechile.calculateRent()//(vechile as Bus).checkIsOverNum(false)}
}
2.3.9 任何数据类型都可以转换成 any 或 unknown 类型,any 或 unknown 类型也可以转换成任何其他数据类型。
function add(one: string | number, two: string | number) {return one as any + two as any
}console.log(add(3, 5))
console.log(add("3", 5))

三、非空断言

也就是在开发过程中,忽略有可能出现的 undefinednull 类型。
这里我们使用 ! 来做这个事情

const box = document.querySelector('.box')
console.log(box!.innerHTML)

当 box 只有可能是 一个内容 或者 undefined 或者 null 的时候,可以用 ! 进行断言,也就是告诉TS,box 不可能是 null 或者 undefined,利用 ! 排除了 undefinednull 的可能。

四、确定赋值断言

在开发阶段,还有这样一种情况,在初始定义某一个变量的时候,有可能是不赋值的,在后面的代码或者函数内再对其进行赋值,然后使用。

// 初始化的时候不进行赋值
let n: number// 通过调用这个函数对 n 进行赋值操作
function init () { n = 100 }
init()// 这里使用一下 x
console.log(x.toFixed(2))

然后就会发现,TS 又提示错误了。这是因为 TS 不清楚init 函数调用以后会对 x 进行赋值
所以就会告诉你,你还没有赋值呢,就调用了 toFixed 方法
这个时候,我们就可以使用确定赋值断言,还是使用 !

// 初始化的时候不进行赋值
let n!: number// 通过调用这个函数对 n 进行赋值操作
function init () { n = 100 }
init()// 这里使用一下 x
console.log(x.toFixed(2))

在初始化的时候,给变量后面加一个 !,也就是告诉 TS,这个变量我一定会百分之一万赋值的。这样今后在遇到你使用 x 这个变量的时候,TS 就会默认认为他一定有值,也就不会提示错误了。

五、const 断言

这个有点和定义变量的关键字差不多,但是又不太一样,注意不要搞混淆!

let n: number = 100 as const
let s: string = 'hello world' as const

这样一来,我们定义的 n 和 s 就不能被更改了。

const obj = { name: 'Jack', age: 18 }

以上示例就是用 const 定义的一个变量,只不过值是一个引用数据类型。 const 只能保证 obj 不会被改变,但是 obj 内部的子级数据是不会被限制的,如果想让 obj 内的每一个成员都是只读的属性,不允许被更改,只能是在书写接口的时候,把每一个属性都定义为 readonly。应用const实现方案如下:

const obj = { name: 'Jack', age: 18 } as const

这样一来,obj 内 所有的子级数据就都不能被更改。

注意⚠️:

  1. constES6 中定义变量的关键字,表明当前定义的是一个常量,不允许被更改,但是对于引用数据类型来说,其子属性还是可以被修改的。
  2. as const 是TS 内的语法,告诉 TS,被断言的内容不管是自己本身还是其子属性都不允许被修改,TS 就会对每一个层级的数据进行最严格的判断和限制。

六、拓展阅读

  • 《TypeScript 进阶专栏》

相关文章:

TypeScript进阶(三):断言

文章目录 一、前言二、类型断言2.1 利用 as 实现断言2.2 利用 <> 实现断言2.3 应用示例2.3.1 如果 A&#xff0c;B 如果是类并且有继承关系2.3.2 如果 A&#xff0c;B 如果是类&#xff0c;但没有继承关系2.3.3 如果 A 是类&#xff0c;B 是接口&#xff0c;并且 A 类实现…...

塔罗牌(基础):大阿卡那牌

塔罗牌&#xff08;基础&#xff09; 大啊卡那牌魔术师女祭司皇后皇帝教皇恋人战车力量隐士命运之轮正义吊人死神节制恶魔高塔星星月亮太阳审判世界 大啊卡那牌 魔术师 作为一个起点&#xff0c;象征&#xff1a;意识行动和创造力。 一个【显化】的概念&#xff0c;即是想法变…...

微服务(一)

文章目录 项目地址一、微服务1.1 分析User的Domian Verb和Nouns 二、运行docker和k8s2.1 Docker1. 编写dockerfile2. 创建docker image3. 运行docker使用指定端口4. 查看当前运行的镜像5. 停止当前所有运行的docker6. 删除不用的docker images7. 将本地的image上传到hub里 2.2 …...

JAVA(SpringBoot)集成Kafka实现消息发送和接收。

SpringBoot集成Kafka实现消息发送和接收。 一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者 君子之学贵一&#xff0c;一则明&#xff0c;明则有功。 一、Kafka 简介 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台&#xff0c;最初由 Link…...

Oracle之开窗函数使用

开窗函数是数据开发面试的必知必会&#xff0c;必须认真对待&#xff0c;上难度&#xff1a; 开窗函数语法格式如下&#xff0c;一共五部分&#xff1a; ①函数(a)over(②<partition by b> ③<order by c> ④<windowing_clause> ⑤开窗范围)1、函数&#xf…...

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一个函数&#xff0c;用于检索一个完整的结果集到一个客户端。当执行一个查询&#xff08;通常是 SELECT 查询&#xff09;并希望处理所有返回的数据时&#xff0c;可以使用此函数。 概念 mysql_store_result() 函数的原型如下&…...

【大数据】数据治理浅析

在数字化时代&#xff0c;数据作为企业的核心资产&#xff0c;其管理和利用显得尤为关键。数据治理&#xff0c;作为数据管理的重要组成部分&#xff0c;旨在确保数据的准确性、一致性、安全性和可用性。本文将从数据治理的基本概念、应用场景、必要性、需求分析等方面出发&…...

第 25 场 蓝桥月赛

4.喜糖摆放【算法赛】 - 蓝桥云课 问题描述 在过年时&#xff0c;蓝桥村的孩子们充满活力&#xff0c;他们化身为捣蛋鬼&#xff0c;挨家挨户寻讨喜糖。他们一共收到了N颗糖&#xff0c;每颗糖的甜度各不相同&#xff0c;第i颗糖的甜度为Ai。 然而&#xff0c;如何分配这些喜…...

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的开发模式&#xff0c;但是也具有其特色的侦听函数&#xff0c;那么当LigerUI作为View层的时候&#xff0c;他所发送后端的必然是表单的数据&#xff0c;在此我们以俩个div为例&#xff1a; {Layout "~/View…...

Vue2下篇

插槽&#xff1a; 基本插槽&#xff1a; 普通插槽&#xff1a;父组件向子组件传递静态内容。基本插槽只能有一个slot标签&#xff0c;因为这个是默认的位置&#xff0c;所以只能有一个 <!-- ParentComponent.vue --> <template> <ChildComponent> <p>…...

python 变量范围的定义与用法

文章目录 1. 局部变量&#xff08;Local Scope&#xff09;示例&#xff1a; 2. 嵌套函数变量&#xff08;Enclosing Scope&#xff09;示例&#xff1a;说明&#xff1a; 3. 全局变量&#xff08;Global Scope&#xff09;示例&#xff1a;说明&#xff1a; 4. 内置变量&#…...

for...in 和 Object.keys().forEach的区别

for…in 和 Object.keys().forEach的区别 1、遍历范围&#xff1a; for…in 会遍历 自身及原型链上的可枚举属性&#xff0c;需用 hasOwnProperty 过滤。 Object.keys() 仅遍历 自身可枚举属性&#xff0c;更安全。 // 定义一个父对象&#xff0c;包含原型链上的属性 const…...

API接口设计模板

API 员工登录接口设计 基本信息 Path&#xff1a; /admin/staff/login **Method&#xff1a;**POST 接口描述&#xff1a; 请求参数 Query 参数名称是否必须示例备注username是admin用户名password是mima密码 返回数据 名称类型是否必须默认值备注其他信息codeinteger必须dat…...

新电脑安装系统找不到硬盘原因和解决方法来了

有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事&#xff1f;后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的&#xff0c;但这会影响硬盘性能&#xff0c;有没有办法解决开启rst模式的情况安装win10或win11呢&…...

”彩色的验证码,使用pytesseract识别出来的验证码内容一直是空“的解决办法

问题&#xff1a;彩色的验证码&#xff0c;使用pytesseract识别出来的验证码内容一直是空字符串 原因&#xff1a;pytesseract只识别黑色部分的内容 解决办法&#xff1a;先把彩色图片精确转换成黑白图片。再将黑白图片进行反相&#xff0c;将验证码部分的内容变成黑色&#…...

网站上的图片无法使用右键“图片另存为”

某些网站想要下载图片&#xff0c;无法使用右键“图片另存为”&#xff0c;网站截获了鼠标右键的快捷键&#xff0c;没法弹出右键菜单。 可以打开“开发者工具”&#xff0c;使用“Elements”面板找到这个元素&#xff0c;在元素上右键&#xff0c;选择“Open in new tab” 结…...

Linux:生产者消费者模型

一、普通生产者消费者模型 1.1 什么是生产者消费者模型 现实生活中&#xff0c;我们也会有像生物世界的生产者和消费者的概念&#xff0c;但是我们的消费者在大多数情况下并不和生产者直接联系&#xff0c;就比如说食物&#xff0c;不能说我今天去找供货商要十个面包&#xff…...

网络安全 | F5-Attack Signatures详解

关注&#xff1a;CodingTechWork 关于攻击签名 攻击签名是用于识别 Web 应用程序及其组件上攻击或攻击类型的规则或模式。安全策略将攻击签名中的模式与请求和响应的内容进行比较&#xff0c;以查找潜在的攻击。有些签名旨在保护特定的操作系统、Web 服务器、数据库、框架或应…...

自然元素有哪些选择?

在设计浪漫风格的壁纸时&#xff0c;自然元素是营造温馨、梦幻氛围的关键。以下是一些常见的自然元素选择&#xff0c;以及它们在壁纸设计中建议&#xff1a; 一、花朵 玫瑰&#xff1a; 特点&#xff1a;玫瑰是浪漫的象征&#xff0c;尤其是红色和粉色玫瑰&#xff0c;能够传…...

基于微信阅读网站小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

linux挂载新硬盘,查看新硬盘,格式化分区,创建挂载点,挂载逻辑卷,整盘方式挂载,LVM方式挂载,查看linux 磁盘卷组的剩余空间,ext4与xfs区别

摘要 挂载新硬盘&#xff0c;本文作者整理了几乎所有相关的知识点 作者采用的是本文第二种挂载方式&#xff08;LVM&#xff09;&#xff0c;只用了下面6条命令搞定 # 说明&#xff1a; # /dev/mapper/appvg-mylv1 逻辑卷完整名称 # # /dev/mapper目录是Linux系统中用…...

Web3.0时代的挑战与机遇:以开源2+1链动模式AI智能名片S2B2C商城小程序为例的深度探讨

摘要&#xff1a;Web3.0作为互联网的下一代形态&#xff0c;承载着去中心化、开放性和安全性的重要愿景。然而&#xff0c;其高门槛、用户体验差等问题阻碍了Web3.0的主流化进程。本文旨在深入探讨Web3.0面临的挑战&#xff0c;并提出利用开源21链动模式、AI智能名片及S2B2C商城…...

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …...

测试的基本原则

1&#xff0e;SDLC 才是王道&#xff1a;软件开发生命周期&#xff08;SDLC&#xff09;对于软件开发而言&#xff0c;是如同基石般的关键流程&#xff0c;每一位开发人员都应该对其了如指掌。从最初的需求定义&#xff0c;到最终软件上线后的维护&#xff0c;SDLC 的各个阶段环…...

如何建设一个企业级的数据湖

建设一个企业级的数据湖是一项复杂且系统化的工程&#xff0c;需要从需求分析、技术选型、架构设计到实施运维等多个方面进行综合规划和实施。以下是基于我搜索到的资料&#xff0c;详细阐述如何建设企业级数据湖的步骤和关键要点&#xff1a; 一、需求分析与规划 明确业务需…...

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…...

springfox-swagger-ui 3.0.0 配置

在3.0中&#xff0c;访问地址URL变了。 http://地址:端口/项目名/swagger-ui/ SpringBoot maven项目引入 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version> </…...

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …...

Spring无法解决的循环依赖

在Spring框架中&#xff0c;循环依赖是指两个或多个Bean相互依赖&#xff0c;形成一个闭环。例如&#xff0c;Bean A依赖于Bean B&#xff0c;而Bean B又依赖于Bean A。虽然Spring通过三级缓存&#xff08;一级缓存、二级缓存、三级缓存&#xff09;机制解决了大多数情况下的循…...

C++的类Class

文章目录 一、C的struct和C的类的区别二、关于OOP三、举例&#xff1a;一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…...

如何应对离别之:短暂离别

《若道离别》&#xff08;一&#xff09;&#xff1a;如何应对离别之短暂离别 大多数人还是不能很全心愉快地面对离别&#xff0c;哪怕只是短暂&#xff0c;还是从有到无的失落感&#xff0c;有人一天就适应&#xff0c;有人需要很久 不求离别无动于衷&#xff0c;但求使用部分…...

Harmony Next 跨平台开发入门

ArkUI-X 官方介绍 官方文档&#xff1a;https://gitee.com/arkui-x/docs/tree/master/zh-cn ArkUI跨平台框架(ArkUI-X)进一步将ArkUI开发框架扩展到了多个OS平台&#xff1a;目前支持OpenHarmony、Android、 iOS&#xff0c;后续会逐步增加更多平台支持。开发者基于一套主代码…...

笔试-二维数组2

应用 现有M(1<M<10)个端口组&#xff0c;每个端口组是长度为N(1<N<100)&#xff0c;元素均为整数。如果这些端口组间存在2个及以上的元素相同&#xff0c;则认为端口组可以关联合并&#xff1b;若可以关联合并&#xff0c;请用二位数组表示输出结果。其中&#xf…...

/opt安装软件,就可以使用man xx命令是为什么

引言 以neovim的安装过程为例 下载 curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz sudo rm -rf /opt/nvim sudo tar -C /opt -xzf nvim-linux64.tar.gz添加环境变量前&#xff0c;是无法使用man nvim的 Then add this to your sh…...

vue3和vue2的区别有哪些差异点

Vue3 vs Vue2 主要差异对比指南 官网 1. 核心架构差异 1.1 响应式系统 Vue2&#xff1a;使用 Object.defineProperty 实现响应式 // Vue2 响应式实现 Object.defineProperty(obj, key, {get() {// 依赖收集return value},set(newValue) {// 触发更新value newValue} })Vue3…...

记录备战第十六届蓝桥杯的过程

1.学会了原来字符串也有比较方法&#xff0c;也就是字符串987 > 98 等等&#xff0c;可以解决拼最大数问题 题目链接&#xff1a;5.拼数 - 蓝桥云课 (lanqiao.cn) 2.今天又复习了一下bfs&#xff0c;感觉还是很不熟练&#xff0c;可能是那个过程我些许有点不熟悉&#xff…...

【PVE】Proxmox VE8.0+创建LXC容器安装docker

为了不影响PVE宿主机&#xff0c;通常使用套娃的形式安装Docker容器&#xff0c;再安装相关docker应用。首先在CT模板中创建 Linux 容器&#xff0c;推荐使用Debian。开启ssh登录&#xff0c;修改debian配置&#xff0c;安装docker 一、创建 LXC 容器 1、CT模板下载 点击“模…...

Semantic Kernel - Kernel理解

目录 一、关于Kernel 二、案例实战 三、运行截图 一、关于Kernel 微软的 Semantic Kernel 项目中,Semantic Kernel 是一个工具框架,旨在使得开发人员能够更容易地将大语言模型(如GPT)集成到不同的应用中。它通过提供一组接口、任务模板和集成模块,使开发者能够轻松地设计…...

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 &#x1f30d;一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 &#x1f30d;二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…...

「 机器人 」利用冲程对称性调节实现仿生飞行器姿态与方向控制

前言 在仿生扑翼飞行器中,通过改变冲程对称性这一技术手段,可以在上冲与下冲两个阶段引入不对称性,进而产生额外的力或力矩,用于实现俯仰或其他姿态方向的控制。以下从原理、在仿生飞行器中的应用和典型实验示例等方面进行梳理与阐述。 1. 冲程对称性原理 1.1 概念:上冲与…...

力扣算法题——11.盛最多水的容器

目录 &#x1f495;1.题目 &#x1f495;2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 &#x1f495;3.代码实现 &#x1f495;4.完结 二十七步也能走完逆流河吗 &#x1f495;1.题目 &#x1f495;2.解析思路…...

企业微信SCRM开创客户管理新纪元推动私域流量高效转化

内容概要 在当今瞬息万变的数字化时代&#xff0c;企业面临着前所未有的客户管理挑战。消费者的需求日益多样化&#xff0c;他们希望能够随时随地与品牌沟通。因此&#xff0c;越来越多的企业意识到&#xff0c;传统的客户管理方式已无法满足市场的需求。在这样的背景下&#…...

C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库

用C实现高性能数据处理&#xff0c;Python实现操作Redshift导入数据文件。 在Visual Studio 2022中用C和ODBC API导出SQL Server数据库中张表中的所有表的数据为CSV文件格式的数据流&#xff0c;用逗号作为分隔符&#xff0c;用双引号包裹每个数据&#xff0c;字符串类型的数据…...

ESP8266 NodeMCU与WS2812灯带:实现多种花样变换

在现代电子创意项目中&#xff0c;LED灯带的应用已经变得极为广泛。通过结合ESP8266 NodeMCU的强大处理能力和FastLED库的高效功能&#xff0c;我们可以轻松实现多达100种灯带变换效果。本文将详细介绍如何使用Arduino IDE编程&#xff0c;实现从基础到高级的灯光效果&#xff…...

OpenAI 发布首个 AI 智能体

OpenAI 发布首个 AI 智能体 当地时间 1 月 23 日&#xff0c;OpenAI 发布了首个 AI 智能体 Operator124。以下是关于它的详细介绍2&#xff1a; 功能用途 操作网页&#xff1a;可模拟人类操作网页浏览器&#xff0c;能进行点击、滚动、输入等操作&#xff0c;例如在 OpenTable…...

【Linux】gcc/g++的使用

目录 一、gcc/g简介 二、编译和链接 预处理 编译 汇编 连接&#xff08;生成可执行文件或库文件&#xff09; 三、动态链接和静态链接 静态库和动态库 gcc其他常用选项 合集传送门&#xff1a;Linux_uyeonashi的博客-CSDN博客 一、gcc/g简介 GCC&#xff08;GNU Com…...

Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性

Kmesh v1.0 正式发布&#xff01;7 大特性提升网络流量管理效率和安全性 2025 年新年伊始&#xff0c;Kmesh 团队正式发布了 Kmesh v1.0234。以下是 Kmesh v1.0 提升网络流量管理效率和安全性的 7 大特性35&#xff1a; 加密通信&#xff1a;引入 IPsec 协议对节点间流量加密&a…...

Day45:元组的创建

在 Python 中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变的序列类型。与列表&#xff08;list&#xff09;不同&#xff0c;元组一旦创建就无法修改它们的内容。元组是有序的&#xff0c;可以包含不同类型的元素&#xff0c;支持索引和切片操作&#xff0c;但不…...

Rust:如何动态调用字符串定义的 Rhai 函数?

在 Rust 中使用 Rhai 脚本引擎时&#xff0c;你可以动态地调用传入的字符串表示的 Rhai 函数。Rhai 是一个嵌入式脚本语言&#xff0c;专为嵌入到 Rust 应用中而设计。以下是一个基本示例&#xff0c;展示了如何在 Rust 中调用用字符串传入的 Rhai 函数。 首先&#xff0c;确保…...

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了&#xff0c;换个日志收集工具 Splunk 是一种 IT 工具&#xff0c;可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说&#xff0c;它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…...