【TypeScript】速通篇
目录
0 前言
1 准备工作
1.1 安装typescript包
1.2 简化运行TS
2 类型注解
2.1 常用类型
2.1.1 原始类型
2.1.2 数组类型
2.1.3 联合类型
2.1.3.1 类型别名
2.1.4 函数类型
2.1.4.1 void类型
2.1.4.2 可选参数
2.1.5 对象类型
2.1.5.1 可选属性
2.1.5.2 接口
2.1.5.2.1 接口与类型别名的区别
2.1.5.2.2 接口继承
2.1.6 元组
2.1.7 类型推论
2.1.8 类型断言
2.2 其他类型
2.2.1 字面量类型
2.2.2 枚举类型
2.2.3 any类型
2.2.4 typeof运算符
2.3 高级类型
2.3.1 class类
2.3.1.1 构造函数
2.3.1.2 实例方法
2.3.1.3 class继承
2.3.1.4 可见修饰符
2.3.1.5 只读修饰符
2.3.2 类型兼容性
2.3.2.1 class
2.3.2.2 接口
2.3.2.3 函数
2.3.3 交叉类型
2.3.3.1 交叉类型(&)和接口继承对比(extends)
2.3.4 泛型
2.3.4.1 泛型约束
2.3.4.2 多泛型变量
2.3.4.3 泛型接口
2.3.4.4 泛型类
2.3.4.5 泛型工具
2.3.4.5.1 Partial
2.3.4.5.2 Readonly
2.3.4.5.3 Pick
2.3.4.5.4 Record
2.3.5 索引签名类型
2.3.6 映射类型
2.3.6.1 索引查询
3 类型声明文件
3.1 介绍
3.2 已有的类型声明文件
3.3 编写类型声明文件
0 前言
黑马程序员视频地址:TypeScript零基础入门到实战全套教程
1 准备工作
1.1 安装typescript包
npm i -g typescript
检测版本:
tsc -v
ts文件需要先转化成js文件再运行:
第一步:
tsc xxx.ts
注意:使用该命令会在同一目录下生成一个同名的js文件
第二步:
node xxx.js
此过程过于繁琐,因此需要 1.2 中的包
1.2 简化运行TS
安装包:
npm i -g ts-node
使用命令:
ts-node xxx.ts
注意:本质上也是先转化再运行,但是此命令并不会生成同名的js文件
注意:若安装了上述两个包,仍然无法运行ts文件,可以尝试运行以下命令之后再试
npx tsc --init
2 类型注解
为变量声明类型
如:
let count: number = 10
此后若修改该变量的类型,则会实时报错
2.1 常用类型
2.1.1 原始类型
const a: number = 1
const b: string = '1'
const c: boolean = true
const d: undefined = undefined
const e: null = null
const f: symbol = Symbol()
2.1.2 数组类型
写法一:推荐
const a: number[] = [1, 2, 3]
const b: string[] = ['1', '2', '3']
const c: boolean[] = [true, false]
const d: null[] = [null, null]
// ...
写法二:不推荐
const a: Array<number> = [1, 2, 3]
const b: Array<string> = ['1', '2', '3']
const c: Array<boolean> = [true, false]
const d: Array<null> = [null, null]
// ...
2.1.3 联合类型
符号:|
示例:
const a: (number | string)[] = [1, 2, '3', '4'] // 既含有数字又含有字符串的数组
const b: number | string[] = 1 //值为数字或字符串数组
const c: number | string[] = ['1', '2'] //值为数字或字符串数组
2.1.3.1 类型别名
当一种复杂类型被多次使用,为了简化书写量,可以给这种类型起一个别名
示例:
type customArr = (number | string)[]
const a: customArr = [1, 2, '3', '4']
const b: customArr = [5, 6, '7', '8']
2.1.4 函数类型
第一种:单独指定参数与返回值的类型
// 写法一:函数声明
function add(a: number, b: number): number{return a + b
}add(1, 2)// 写法二:函数表达式(箭头函数)
const subtract = (a: number, b: number): number => {return a - b
}subtract(1, 2)
第二种:同时指定参数与返回值类型(只适用于函数表达式)
const add: (a: number, b: number) => number = (a, b) => {return a + b
}add(1, 2)
理解:在声明add这个变量时,同时给他以箭头函数的形式设置参数类型,这样再在后面使用函数表达式时就不需要再次写类型了
第一步:
const add = (a, b) => {return a + b
}
第二步:
add: (a: number, b: number) => number
2.1.4.1 void类型
写法一样,函数没有返回值时就写void
此处不再赘述
2.1.4.2 可选参数
符号: ?
注意:可选参数必须在必选参数后面
示例:
function add (a: number, b?: number): void {console.log(a, b)
}
2.1.5 对象类型
示例:先给对象结构声明属性的类型,再赋值
const object: { name: string, age: number, sayHi(a: number): void } = {name: 'USERA_001',age: 19,sayHi(a){console.log(a)}
}
注意:函数用法与上面相同,在给属性中函数声明类型的时候要加小括号
对象中的方法也可以用另一种方法写,即统一给函数名声明参数即返回值的类型
const object: { name: string, age: number, sayHi: (a: string) => void } = {name: 'USERA_001',age: 19,sayHi(a){console.log(a)}
}
声明属性类型时,如果写在一行,不同属性值之间要用分号或逗号分割,也可以选择分行写:
const object: {name: stringage: numbersayHi(a: number): void
} = {name: 'USERA_001',age: 19,sayHi(a){console.log(a)}
}
2.1.5.1 可选属性
符号: ?
用法与函数类型相同,此处不再赘述
2.1.5.2 接口
与联合类型中的类型别名相同,同样是为了复用
示例:
interface information {name: stringage: numbersayHi(a: number): void
}const object: information = {name: 'USERA_001',age: 19,sayHi(a){console.log(a)}
}
2.1.5.2.1 接口与类型别名的区别
接口只能给对象指定类型,而类型别名可以给任意类型使用
如,给对象使用类型别名:
type information = {name: stringage: numbersayHi(a: number): void
}const object: information = {name: 'USERA_001',age: 19,sayHi(a){console.log(a)}
}
2.1.5.2.2 接口继承
关键字:extends
示例:
interface Point1 {a: number,b: number
}interface Point2 extends Point1 {c: number
}const object: Point2 = {a: 1,b: 2,c: 3
}
2.1.6 元组
特点:是数组的一种,规定了数组的个数与具体类型
示例:
const arr: [number, string] = [1, '2']
2.1.7 类型推论
可省略类型注解的场景:
1.声明变量并初始化时
2.决定函数返回值时
推荐:能省则省
使用le声明变量不指定类型时,由于类型推论机制,会自动根据值来指定类型
使用const声明常量不指定类型时,该常量的数据类型就是所被赋予的值
2.1.8 类型断言
获取元素赋值给变量时,变量的类型会显示的是最宽泛的类型,导致拿不到特定标签的特定属性,如a标签的href属性,因此需要类型断言,给其设置一个更细致的类型
// 写法一:推荐
const ele = document.querySelector('.ele') as HTMLAnchorElement// 写法二:了解,在react中会有冲突,不推荐
const ele = <HTMLAnchorElement>document.querySelector('.ele')
可以通过在浏览器中选中标签,然后使用console.dir打印$0对象,即可查看当前标签具体类型
2.2 其他类型
2.2.1 字面量类型
任意一个固定的值都可以作为一种类型,这会使得该变量的值只能是指定的这个值
字面量类型常配合联合类型使用,从而达到限制选择类型的效果
示例:
function a(action: 'up' | 'down' | 'left' | 'right') {console.log(action)
}a('up')
2.2.2 枚举类型
具有一组具名的常量,类似于上面代码中字面量与联合类型配合实现的效果
enum choose {up,down,left,right
}function a(action: choose) {console.log(action)
}a(choose.up)
注意:使用时需要用 枚举类型.具体常量 的形式
数字枚举:
这一组具名常量会以第一个常量的值为开始自增,默认第一个常量为0
如果为其第一个常量设置一个数字,如10,则后续常量的值会变成11、12...
字符串枚举:
若其中有一个常量被赋值一个字符串,则所有常量都必须赋予一个指定的值,因为字符串枚举没有自增长行为
注意:推荐使用字面量+联合类型的方法,因为枚举类型在转成js代码时,会被编译为js代码,而前者则会被自动忽略
2.2.3 any类型
不推荐使用!!!
使用该类型意味着可以对声明的变量进行任何操作,包括以函数形式调用,都不会报错!
这就失去了ts存在的意义
默认变成any类型的情况:
1.声明变量时,不给类型,不给值
2.函数形参不给类型
2.2.4 typeof运算符
功能一:查询变量或属性类型
let a: {b: number,c: string
} = {b: 1,c: '1'
}let d:number = 1console.log(typeof a)
console.log(typeof a.b)
console.log(typeof d)
功能二:引用变量或属性的类型
let o: {b: number,c: string
} = {b: 1,c: '1'
}let p: typeof o = {b: 2,c: '2'
}let h: typeof o.b = 1
与类型别名十分相似,但是 typeof 可以直接把已经有的类型拿过来使用
2.3 高级类型
2.3.1 class类
注意:黑马程序员的js系列课程中并没有讲class类,但ts课程中的内容与其大差不差
2.3.1.1 构造函数
js中,类的使用示例:
class Person{constructor(age, name){ // 设置动态属性this.age = agethis.name = name}hobby = 'football' // 静态属性
}const xm = new Person(18, 'zs')
console.log(xm)
注意:直接在构造函数内赋值即可,构造函数外无需再次声明
ts中则需额外声明:
class Person {constructor(name: string, age: number){this.name = namethis.age = age}name: stringage: numberhobby = 'football'
}const person = new Person('张三', 18)
console.log(person)
注意:不能给构造函数constructor指定返回类型,其他函数方法可以设置返回类型
2.3.1.2 实例方法
补课:js类中声明方法时,直接写方法名(),不能写function
注意:方法其实是定义在原型上的
在ts类中,声明方法的类型注解与函数相同
示例:
class Person {sayHi(content: string){console.log(content)}
}const zs = new Person()
zs.sayHi('你好')
2.3.1.3 class继承
方法一:extends(继承父类)
注意:此方法在js中也有
继承之后,即具有父类所有的属性与方法
示例:
class Father {move(){console.log('1')}
}class Son extends Father {walk(){console.log('2')}name = 'ls'
}const ls = new Son()
ls.move()
ls.walk()
console.log(ls.name)
方法二:implements(实现接口)
此种方法其实并不算继承类,只能算约束类
即必须写接口中提供的属性与方法
interface person {name: stringmove(): void
}class Baby implements person {name = '张三'move(): void {}
}
2.3.1.4 可见修饰符
第一种:public(默认):对该类及其实例化对象、子类及其实例化对象都可见
class Father {public move() {}
}const zs = new Father()
zs.move()class Son extends Father {}const ls = new Son()
ls.move()
第二种:protected:仅对该类及子类开放,实例化对象都不可见
class Father {protected move() {}
}const zs = new Father()
// zs.move() 这是错的class Son extends Father {walk(){this.move()}
}const ls = new Son()
// ls.move() 这是错的
第三章:private:仅对该类内部开放,该类的实例化对象以及子类及其实例化对象都不可见
class Father {private move() {}
}const zs = new Father()
// zs.move() 这是错的class Son extends Father {walk(){// this.move() 这是错的}
}const ls = new Son()
// ls.move() 这是错的
2.3.1.5 只读修饰符
注意:
1.只能给属性使用,不能给方法使用
2.如果不加类型注解,则会被识别为字面量类型
3.接口或{}表示的对象类型,也可以使用
示例:
class Person {readonly name: string = '张三'constructor(name: string){this.name = name}changeName(name: string){// this.name = name 这是错误的}
}const zs = new Person('李四')
// zs.name = '张三' 这是错误的
2.3.2 类型兼容性
ts采用的是结构化类型系统,即关注结构是否相似而非简单的名称是否相似
2.3.2.1 class
在class中,拥有相同成员的类可以相互使用,如:
class Point1 {name: string = '1'age: number = 1
}class Point2 {name: string = '2'age: number = 2
}const D1: Point1 = new Point2()
const D2: Point2 = new Point1()
也可以将至少包含被赋值的类的成员的类赋值给该类,即可以将多成员类赋值给少成员类,但至少要包含他里面的所有成员,如:
class Point1 {name: string = '1'age: number = 1
}class Point2 {name: string = '2'age: number = 2hobby: string = '打篮球'
}const D1: Point1 = new Point2()
// const D2: Point2 = new Point1() 这是错误的
2.3.2.2 接口
在接口中同理,直接看示例:
interface Point3 {name: stringage: number
}interface Point4 {name:stringage: number
}let D10: Point3 = {name: '', age: 18}
let D20: Point4 = D10
注意:类与接口之间也满足该规则,示例:
class Point8 {name: string = '张三'age: number = 18
}interface Point9 {name: stringage: number
}let D4: Point9 = new Point8()
class Point8 {name: string = '张三'age: number = 18hobby: string = '打篮球'
}interface Point9 {name: stringage: number
}let D4: Point9 = new Point8()
// let D5: Point9 = {name: '', age: 18}
// let D6: Point8 = D5 这是错误的
2.3.2.3 函数
参数个数:参数少的可以赋值给参数多的
参数类型:相同位置的参数类型要相同(原始类型)或兼容(对象类型)
若传入对象类型,则此处的兼容,不是按照类或接口的规则来看,而是把这个对象的属性看成是参数,因此遵循 “参数少的可以赋值给参数多” 的这条规则
返回值类型:
1.原始类型:相同数据类型可以互相赋值
2.对象类型:遵循成员多的赋值给成员少的
2.3.3 交叉类型
符号:&
作用:组合多种类型成一个类型(常用于对象类型)
示例:
interface Point01 {name: string
}interface Point02{age: number
}type Point03 = Point01 & Point02let obj: Point03 = {name: '',age: 18
}
2.3.3.1 交叉类型(&)和接口继承对比(extends)
相同点:都可以实现对象类型的组合
不同点:对于同名不同类型的属性,使用接口继承会报错,而使用交叉类型会变成never类型,即无法赋值,也相当于错误
但是在函数参数值类型冲突时,交叉类型会兼容两种冲突类型
interface A {// name: stringfn: (value: number) => string
}interface B {// name: numberfn: (value: string) => string
}type C = A & Blet D:C = {fn(value: number | string): string {return ''}
}
2.3.4 泛型
示例:Type可以是任意合法标识符
function method<Type> (value: Type): Type {return value
}method<number>(1)method<string>('1')method<boolean>(true)
注意:上述代码中在调用函数时写的<类型>可以省略,省略后,会由类型推断机制来推断类型,如:
function method<Type> (value: Type): Type {return value
}let a = method<number>(1)
此时a的类型为number,但是要注意的是,method的类型会变成字面量类型,但这并不影响什么
注意:原则是能省则省,省略不了还需显示传入类型
2.3.4.1 泛型约束
方法一:指定更加具体的类型
function A<Type>(value: Type[]):void {console.log(value.length)
}A(['2', 1])
方法二:extends添加约束
约束传进来的类型:
function id<T extends string | number> (value: T): T {return value
}id(1)
id('1')
// id(true) 错误写法
约束传进来的值必须拥有某属性:
function id<T extends {length: number}> (value: T): T {return value
}id([])
id('')
id({length: 10})
// id({}) 错误写法
// id(1) 错误写法
2.3.4.2 多泛型变量
示例:第一个参数可以是任意类型,而第二个参数被约束只能是string或number类型
function id<Type, Key extends string | number> (value1: Type, value2: Key) {return '1'
}id(1, 1)
id(1, '1')
// id(1, false) 错误写法
keyof 的作用:
// 定义一个接口
interface Person {name: string;age: number;isStudent: boolean;
}// 使用 keyof 获取 Person 接口的所有属性名组成的联合类型
type PersonKeys = keyof Person;// PersonKeys 等价于 'name' | 'age' | 'isStudent'
根据第一个参数数据类型来约束第二个参数数据类型:
function A<Type,Key extends keyof Type> (value1: Type, value2: Key) {return '1'
}A({name: '张三', age: 18}, 'age')
A(2, 'toFixed')
A([], 'forEach')
2.3.4.3 泛型接口
接口中也可以使用泛型,但要注意必须显示传入类型
示例:
interface Point<Type> {move: (value: Type) => Type
}const obj: Point<number> = {move(value){return value}
}
obj.move(1)
数组类型其实就是一个泛型接口
2.3.4.4 泛型类
泛型类可以选择是否传入类型
class Point<Type> {name: Typeconstructor(name: Type){this.name = name}
}let obj = new Point(1)
let obj2 = new Point('1')
2.3.4.5 泛型工具
2.3.4.5.1 Partial
作用:复制一份原有类型,并且将其所有属性或方法变成可选项
示例:
interface Point {name: stringage: number
}type TypeA = Partial<yiu>let aoo: Point = {name: '',age: 1// 所有属性必填
}let boo: TypeA = {} // 所有属性选填
2.3.4.5.2 Readonly
作用:复制一份原有类型,并将其所有属性或方法变成只读项
示例:
interface Point {name: string,age: number
}type TypeA = Readonly<Point>let obj: Point = {name: '张三',age: 18
}obj.name = '李四'let obj2: TypeA = {name: '张三',age: 18
}// obj2.name = '李四' 这是错误的
2.3.4.5.3 Pick
作用:从原有类型中挑出指定属性或方法,来构成一个新类型
示例:
interface Point {name: string,age: number,hobby: stringmove: (value: number) => string
}type TypeA = Pick<Point, 'name' | 'age' | 'move'>let obj: TypeA = {name: '张三',age: 18,move(value){return ''}
}
2.3.4.5.4 Record
作用:快速创建属性类型都相同的类型
示例:
type TypeA = Record<'name' | 'age' | 'sss', number>
// 所有属性类型都是 number
type TypeB = Record<'name' | 'age' | 'sss', number | string>
// 所有属性类型都是 number|string
2.3.5 索引签名类型
使用场景:无法确定对象中有哪些属性时使用
小知识:js对象中的键是string类型的
示例:
interface point<Type> {[Key: string]: Type
}let obj: point<number> = {a: 1,b: 2,c: 333
}
2.3.6 映射类型
基于联合类型来生成相对应的对象属性
注意:只能用于类型别名,不能用于接口
示例:
type TypeA = 'x' | 'y' | 'z'
type TypeB = {[Key in TypeA]: number
}
也可以基于对象类型来生成相对于的对象属性
使用keyof:获取对象类型中所有键的联合类型
示例:
type TypeA = {name: string,age: number
}
type TypeB = {[Key in keyof TypeA]: number
}
2.3.6.1 索引查询
作用:查询属性的类型
写法:类似于js中访问对象属性一样
示例:
type Prop = {a: string,b: number
}type TypeA = Prop['a']
同时查询多个类型:
type Prop = {a: string,b: number
}type typeA = Prop['a' | 'b']
type typeB = Prop[keyof Prop]
3 类型声明文件
3.1 介绍
ts文件在编译成js文件后,类型等相关代码都会消失,但是.d.ts文件(类型声明文件)则不会消失,可以继续提示类型
3.2 已有的类型声明文件
内置类型声明文件:
TS为JS运行时可用的所有标准化内置API都提供了声明文件
第三方库的类型声明文件:
使用npm i 安装第三方库后,导入后会显示缺失头文件
GitHub - DefinitelyTyped/DefinitelyTyped:高质量 TypeScript 类型定义的存储库。
此库提供了高质量的常用的第三方库的类型声明文件
可以通过以下命令来获取:
npm i -D @types/包名
3.3 编写类型声明文件
1.项目内共享类型:
多个ts文件用到同一种类型时,可以封装成.d.ts文件
// c.d.tsinterface Point {name: string,age: number
}export { Point }
// a.tsimport { Point } from "./c"let obj1: Point = {name: '张三',age: 18
}
// b.tsimport { Point } from "./c"let obj2: Point = {name: '李四',age: 19
}
2.为已有js文件提供类型声明
ts项目中也可以使用js文件,在导入js文件时,会自动找与其同名的.d.ts文件,以提供类型声明
declare关键字作用:
在ts中为其他地方已经存在的变量声明类型,以告知ts并不是创建一个新的变量
示例:
// a.tsimport { name, obj, move, go, Point } from "./b"console.log(name, obj)
move(1)
go(1)let obj2: Point = {name: '张三',age: 18
}
// b.jslet name = '张三'
let obj = {name: '李四',age: 18
}
function move(value) {console.log(value)return value
}const go = (value) => {console.log(value)return value
}export { name, obj, move, go }
// b.d.tsdeclare let name: string//写法一:
interface Point {name: string,age: number
}
declare let obj: Point
// 写法二:
// declare let obj: {name: string, age: number}declare function move(value: number): numbertype func = (value: number) => number
declare const go: funcexport { name, obj, move, go, Point }
此后用react做演示的例子暂时停更,因为react还没学...
相关文章:
【TypeScript】速通篇
目录 0 前言 1 准备工作 1.1 安装typescript包 1.2 简化运行TS 2 类型注解 2.1 常用类型 2.1.1 原始类型 2.1.2 数组类型 2.1.3 联合类型 2.1.3.1 类型别名 2.1.4 函数类型 2.1.4.1 void类型 2.1.4.2 可选参数 2.1.5 对象类型 2.1.5.1 可选属性 2.1.5.2 接口 2.…...
flutter 引擎初始化
在 Flutter 混合开发中,iOS 端的 Flutter 引擎初始化时机 取决于集成方式(纯 Flutter 或混合开发)。以下是详细分析: 1. 纯 Flutter 应用(默认 Flutter App) 初始化时机 启动…...
Spring Boot 连接 Microsoft SQL Server 实现登录验证
Spring Boot 连接 Microsoft SQL Server 实现登录验证 这篇文章将非常系统地讲解如何使用 Spring Boot 结合 Microsoft SQL Server 2019 完成一个完整的登录验证系统,包括数据库连接问题、SSL证书错误处理、CORS跨域详细解释和解决方案。 适合需要前后端联调、单独…...
腾讯云智三道算法题
import java.math.BigDecimal; import java.math.BigInteger; import java.util.*;public class MyMain {//第一题:一个水果切成n块public static void getRes(int n, int l, int r){int min -1;int max -1;for (int il;i<r;i){if (i%n0){min i/n;break;}}for…...
语音合成之七语音克隆技术突破:从VALL-E到SparkTTS,如何解决音色保真与清晰度的矛盾?
从VALL-E到SparkTTS,如何解决音色保真与清晰度的矛盾? 引言语音克隆技术发展史YourTTS:深入剖析架构与技术VALL-E:揭秘神经编解码语言模型MaskGCTSparkTTS:利用 LLM 实现高效且可控的语音合成特征解耦生成式模型特征解…...
【Pandas】pandas DataFrame rdiv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
maven打包时配置多环境参数
1. pom配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…...
【Linux】基本指令(下)
目录 一、详解指令补充知识1:什么是压缩 19. zip 指令(1)-r 选项(2)zip 和 unzip 的安装 20. unzip 指令(1)-d 选项补充知识2:本地机器与云服务器补充知识3:本地机器与云…...
NVLink、UALink 崛起,PCIe Gen6 如何用 PAM4 迎战未来?
现在数字经济发展地相当快速,像Cloud、现在火红的AI、大数据这些新技术都需要在数据中心里运行更多运算,伴随而来的是更快的数据传输速度的需求。 在数据中心,有很多条数据传输路径,举例 : Server 和Storage之间&…...
23种设计模式-行为型模式之迭代器模式(Java版本)
Java 迭代器模式(Iterator Pattern)详解 🧠 什么是迭代器模式? 迭代器模式是一种行为型设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。 🎯 使用场景 …...
指标监控:Prometheus 结合 Grafana,监控redis、mysql、springboot程序等等
软件作用说明 Prometheus:采集各种指标数据(如CPU、内存、请求数),并存储到时序数据库中。Grafana:数据可视化,生成监控仪表盘。 架构说明 被监控服务(如Redis/MySQL/SpringBoot&a…...
微信小程序,基于uni-app的轮播图制作,调用文件中图片
以便捷为目的,想使用文件中的图片制作轮播图 但网上找到的都是轮播图彼此分割,没有使用数组存储在一起,不便于管理,代码不美观简洁 作者使用文件中的图片,并使用数组制作轮播图的具体操作如下:࿰…...
未来医院已来:AI如何实现无死角安全监控
AI智慧医院如何用算法守护安全与效率 ## 背景:医疗场景的智能化转型需求 现代医院作为人员密集、场景复杂的公共场所,面临诸多管理痛点:患者跌倒可能延误救治、医闹事件威胁安全、医疗垃圾处置不当引发感染风险、重点区域(如药…...
搭建动态SQL取数
日常取数的时候可能会存在动态SQL的问题,比如取数动态或者条件动态等情况,下面针对动态SQL做一个完整的处理。包括SELECT 、FROM、WHERE 以及 最后table的动态。 首先 数据定义,这里全按照表来append处理 TYPES:BEGIN OF ty_data,edpline T…...
Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
目录 函数简介 函数定义,调用,传入参数,返回值 函数的定义 函数的调用和传入参数 函数的返回值 函数简介 函数简介:函数是组织好,可重复使用,用来实现特定功能(特定需求)的代码…...
下垂控制属于构网型控制技术
下垂控制属于构网型控制,而非跟网型控制。 一、构网型与跟网型控制的本质区别 控制策略差异 构网型控制(Grid-Forming Control, GFM): 通过模拟同步发电机的特性(如转子运动方程),自主构建电压幅…...
主流 LLM 部署框架
主流 LLM 部署框架 框架主要特点适用场景vLLM- 超快推理(高吞吐) - 动态批处理 - 支持 HuggingFace Transformer - 支持 PagedAttention高并发、低延迟在线推理TGI (Text Generation Inference)- Huggingface官方出品 - 多模型管理 - 支持动态量化 - 支持…...
数据库系统概论(四)关系操作,关系完整性与关系代数
数据库系统概论(四)详细讲解关系操作,关系完整性与关系代数 前言一、什么是关系操作1.1 基本的关系操作1.2 关系数据语言的分类有哪些 二、关系的完整性2.1 实体完整性2.2 参照完整性2.3 用户的定义完整性 三、关系代数是什么3.1 传统的集合运…...
C#里使用libxl来加载网络传送过来的EXCEL文件
从服务器传送过来的数据,是一个EXCEL文件, 那么怎么样获取里面的数据比较合适呢? 是不是把数据先保存到文件,再使用传统的方式打开它呢? 其实这样做,也是可以的,对于比较大的文件来说。 如果文件比较小,就不必要这样做了,可以直接保存在内存,然后使用函数LoadRaw…...
Make + OpenOCD 完成STM32构建+烧录
目录 前言 准备工作 开始操作 后记 前言 前两篇通过VSCodeSTM32CubeMx跑通了用EIDE构建烧录。为今天的工作打下了非常棒的基础!今天来尝试手动构建烧录。 准备工作 安装Make,我这次用的是Win10,所以需要安装一个新朋友 msys2 ࿰…...
Linux:进程间通信->命名管道
1. 命名管道 概念 是一种进程间通信(IPC)机制,能允许没有关联的两个进程进行数据交换。 由于匿名管道只能在有亲缘关系的父子进程间通信所以具有局限性,所以就要通过命名管道来对两个没有关系的进程进行通信。 命名管道是通过路径和文件名来使两个进…...
CS001-50-depth
目录 深度图 如何写入深度图 长什么样子 copy depth pass z反转 如何读取深度图&还原世界坐标 深度图 深度图,是记录离物体离摄像机最近的图。 如何写入深度图 深度图,在urp中,如果相机开启了需要深度图的话,会自动在…...
开源AI视频FramePack发布:6GB显卡本地运行
您现在可以在自己的笔记本电脑上免费生成完整的离线AI视频。 只有GPU和纯粹的创造力。 这到底是什么? 一个名为FramePack的新型离线AI视频生成器几天前在GitHub上发布 — 几乎没人在谈论它。这很奇怪,因为这个工具真的很厉害。 它允许您从静态图像和提示词在自己的机器上…...
P3309 [SDOI2014] 向量集 Solution
Description 有一个向量列表,初始为空,有 n n n 个操作分两种: add ( x , y ) \operatorname{add}(x,y) add(x,y):将向量 ( x , y ) (x,y) (x,y) 添加到列表末尾. query ( x 0 , y 0 , l , r ) \operatorname{query}(x_0…...
深入探究 MySQL 架构:从查询到硬件
了解数据库的底层工作原理对于开发人员和系统架构师来说至关重要。在本指南中,我们将探索 MySQL 查询的奇妙旅程,从它离开应用程序的那一刻起,直到到达物理存储层——每个步骤都配有真实的示例。 旅程开始:应用层 当您的应用程序执行 SQL 查询时,它会启动一系列复杂的事件…...
matlab实现稀疏低秩去噪
稀疏低秩去噪的matlab代码,包括OMP算法与KSVD算法 IGARSS2013/cal_ssim.m , 6372 IGARSS2013/Compute_NLM_Matrix.m , 2004 IGARSS2013/FeatureSIM.m , 18790 IGARSS2013/KSVD_Matlab_ToolBox2/demo1.m , 1907 IGARSS2013/KSVD_Matlab_ToolBox2/demo2.m , 3679 IGA…...
泽润新能IPO隐忧:募资缩水2亿元,毛利率两连降,内控存瑕疵?
撰稿|行星 来源|贝多财经 又一家光伏企业,即将登陆资本市场。 近日,江苏泽润新能科技股份有限公司(SZ: 301636,下称“泽润新能”)对外发布了首次公开发行股票并在创业板上市的招股意向书,并于4月25日启动…...
20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件
20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件 2025/4/26 21:30 缘起:使用NanoPi NEO开发板,编译FriendlyCore系统,打包eMMC固件的时候报错。 1、在ubuntu14.04下git clone异常该如何处理呢ÿ…...
商用车与农用车电气/电子架构 --- 赋能智能车队管理与远程信息处理
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
Medical Image Nnalysis发表对抗多实例学习框架,基于病理切片进行生存分析
小罗碎碎念 在医学AI领域,全切片图像(WSI)的生存分析对疾病预后评估至关重要。 现有基于WSI的生存分析方法存在局限性,经典生存分析规则使模型只能给出事件发生时间的点估计,缺乏预测稳健性和可解释性;且全…...
Ubuntu20.04部署Dify(Docker方式)
Ubuntu20.04部署Dify(Docker方式) Ubuntu20.04 DifyInstall DockerInstall Docker ComposeRun DifyRunning Ollama 由于写这篇博客的时候电脑还没装输入法,所以先用半吊子英文顶着了…关于最后运行ollama的部分可以无视,因为我修改…...
常见的六种大语言模型微调框架
六大主流微调框架详细解析 框架简介优势劣势Hugging Face PEFT专注于「参数高效微调」(LoRA、Prefix、Prompt-tuning等)的小型库,直接挂在Transformers上用。简单稳定,兼容性好,文档丰富,适配各种小模型到中…...
高精度3D圆弧拟合 (C++)
本文的目的是实现高精度的3D圆弧拟合,若对精度要求不高,可使用PCL的圆拟合接口,参见 PCL拟合空间3D圆周 fit3DCircle-CSDN博客 ---------------------------------------------------------------------------------------------------------…...
WPF定义扩展属性和依赖属性
WPF扩展属性与依赖属性详解 一、依赖属性(Dependency Property)详解 1. 什么是依赖属性? 依赖属性是WPF框架的核心特性之一,它允许属性值依赖于: 父元素的属性值(继承)样式和模板动画数据绑定资源查找2. 依赖属性的特点 属性值继承:子元素可以继承父元素的属性…...
微信小程序 - 根据经纬度打开导航
一、获取到指定的经纬度后 二、设置打开导航 onReady() {this.mapCtx wx.createMapContext(myMap)},openMap() {this.mapCtx.openMapApp({latitude: this.data.latitude,longitude: this.data.longitude,destination: this.data.destination,success: (res) > {console.log…...
WPF实现类似Microsoft Visual Studio2022界面效果及动态生成界面技术
WPF实现类似VS2022界面效果及动态生成界面技术 一、实现类似VS2022界面效果 1. 主窗口布局与主题 <!-- MainWindow.xaml --> <Window x:Class"VsStyleApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x…...
驱动开发(1)|鲁班猫rk356x内核编译,及helloworld驱动程序编译
前言 在进行驱动开发或内核定制时,编译内核源码是一个不可或缺的步骤。内核源码不仅为驱动模块的编译提供了必要的构建环境,还确保了驱动与操作系统内核之间的紧密兼容性。随着内核版本的不断更新,内核内部的数据结构、API接口或系统调用可能…...
深入剖析 Vue 组件:从基础到实践
引言 在前端开发领域,Vue.js 以其简洁易用和高效灵活的特点深受开发者喜爱。而 Vue 组件作为 Vue.js 的核心概念之一,是构建大型应用的基石。无论是简单的按钮、表单,还是复杂的页面布局、功能模块,都可以封装成组件,…...
C++武功秘籍 | 入门知识点
目录 0. 前言 1. C的第一个程序 2. 域 2.1 分类 2.2 作用 2.3 命名空间 2.3.1 定义 2.3.2 namespace概念 2.3.3 使用 3. 输入和输出 3.1 3.2 cin 3.3 cout 3.4 endl 4. 缺省参数 4.1 定义 4.2 分类 4.3 特点 5. 函数重载 5.1 定义 5.2 类型分类 5.2.1.参数类型不同 5.2.2. 参数…...
[官方IP] Shift RAM
Xilinx Shift RAM IP (PG122) 详细介绍 概述 Xilinx Shift RAM IP 是 AMD Xilinx 提供的一个 LogiCORE™ IP 核,用于在 FPGA 中实现高效的移位寄存器(Shift Register)。该 IP 核利用 FPGA 的分布式 RAM(Distributed RAM…...
Trae国际版+BrowserTools MCP yyds!!!
这是为您的博客优化的版本,结构更清晰、痛点更突出,并增加了技术细节和用户价值: 📢《告别手动抓狂!Trae国际版BrowserTools MCP 实现前端错误调试自动化》🚀 作为前端开发者,你是否经历过这些…...
Kdenlive 中的变形、畸变、透视相关功能
Kdenlive 中的变形、畸变、透视相关功能 flyfish Kdenlive 是一款开源、跨平台的非线性视频编辑软件,支持 Windows、macOS 和 Linux 系统. 滚动 通常指让画面内容(如字幕、图像)沿特定方向(垂直或水平)滚动显示。 用于…...
蓝桥杯 8. 移动距离
移动距离 原题目链接 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯。 当排满一行时,从下一行相邻的楼往反方向排号。 例如,当小区排号宽度为 6 时,排列如下: 1 2 …...
2025.04.26-美团春招笔试题-第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 树上路径权值递增 问题描述 LYA正在开发一款基于树的图形渲染引擎,她需要实现一种特殊的路径增强效果。在这个效果中,她需要沿着树上的简单路径为节点赋予递增的权值增益。 …...
c++_csp-j算法 (5)
动态规划 介绍 动态规划(Dynamic Programming)是一种常用的解决优化问题的算法设计技术,常用于解决具有重叠子问题和最优子结构性质的问题。动态规划算法通过将问题划分为子问题,解决子问题并将子问题的解保存起来,最终构建出原问题的解。在本节中,我们将详细介绍动态规…...
力扣2444. 统计定界子数组的数目:Java三种解法详解
力扣2444. 统计定界子数组的数目:Java三种解法详解 题目描述 给定整数数组 nums 和两个整数 minK 和 maxK,统计满足以下条件的子数组数目: 子数组的最小值等于 minK;子数组的最大值等于 maxK。 示例: 输入…...
安全生产知识竞赛宣传口号160句
1. 安全生产是责任,每个人都有责任 2. 安全生产是保障,让我们远离危险 3. 安全生产是团结,共同守护每一天 4. 注重安全,守护明天 5. 安全生产无小事,关乎千家万户 6. 安全第一,人人有责 7. 安全生产无差别&…...
【Hive入门】Hive动态分区与静态分区:使用场景与性能对比完全指南
目录 1 Hive分区技术概述 2 静态分区详解 2.1 静态分区工作原理 2.2 使用场景 2.3 示例 3 动态分区深度解析 3.1 动态分区执行流程 3.2 使用场景 3.3 示例 4 使用场景对比 4.1 场景选择 5 性能对比与优化 5.1 插入性能 5.2 查询性能 5.3 小文件问题 6 最佳实践 6.1 混合分区策略…...
6.1腾讯技术岗2025面试趋势前瞻:大模型、云原生与安全隐私新动向
2025年腾讯技术岗面试趋势前瞻:大模型、云原生与安全隐私新动向 随着AI技术与云计算的深度融合,腾讯校招技术岗面试正呈现出三大核心趋势:AI大模型应用深化、云原生技术迭代加速、安全隐私技术刚需化。本文结合腾讯2025年最新技术布局&#…...
探秘卷积神经网络:深度学习的图像识别利器
在深度学习领域,卷积神经网络(Convolutional Neural Networks,CNN)是图像识别任务的关键技术。它的起源可以追溯到 20 世纪 80 - 90 年代,但受限于当时的软硬件条件,其发展一度停滞。随着深度学习理论的不断…...