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

TypeScript入门指南

TypeScript学习总结内容目录:

  1. TypeScript概述 TypeScript特性。
  2. Javascript与TypeScript的区别
        * TypeScript安装及其环境搭建
  3. TypeScript类型声明
         * 单个类型声明,多个类型声明
         * 任意类型声明
        * 函数类型声明
         * unknown类型【未知类型】
        * 对象类型声明
         * 数组类型声明
         * 元组
         * 枚举
  4. TypeScript编译选项
        * 自动编译文件
         * 自动编译整个项目
  5. webpack打包TS代码
         * 配置打包命令
         * 创建build文件夹里面webpack.config.js配置
  6. TypeScript面向对象
        * 定义类
        * 修饰符
        * 方法重载
        * 抽象类
        * 接口
         * 扩展接口
  7. 类装饰器
  8. 映射类型
  9. 条件类型

TypeScript概述

TypeScript是JavaScript的一个超集,支持ECMAScript 6 ES6标准,TypeScript设计目标是开发大型应用,它可以编译成纯Javascript,编译出来的Javascript可以运行在任何浏览器上。

TypeScript特性。

TypeScript是一种给JavaScript添加特性的语言扩展,增加一下功能,类型批注和编译时类型检查,类型推断,类型擦除,接口,枚举,Mixin,泛型编程,名字空间,元组,Await,和冲ECMA2015移植过来的,类,模块,lambda函数的箭头语法,可选参数以及默认参数。

Javascript与TypeScript的区别

TypeScript是Javascript的超集,扩展了JavaScript的语法,因此现有的Javascript代码可以与TypeScript一起工作无需任何更改,TypeScript通过类型注解提供编译时静态类型检查,TypeScript可处理已有的JavaScript代码,并只对其中的TypeScript代码进行编译。
TypeScript与JavaScript的区别 TypeScript与JavaScript的区别
TypeScript安装及其环境搭建

  1. 下载Node.js 并 安装Node.js

    【下载NodeJS】
    TypeScript安装及其环境搭建
    TypeScript安装及其环境搭建
    一直”next“
    TypeScript安装及其环境搭建
    一直"next"
    ![TypeScript安装及其环境搭建]](https://img-blog.csdnimg.cn/931c7af0b93d4d729faf544f5119ab29.png)
    选择安装路径
    TypeScript安装及其环境搭建
    TypeScript安装及其环境搭建
    TypeScript安装及其环境搭建
    搭建完成~
    TypeScript安装及其环境搭建

  2. 使用全局安装typeScript
    TypeScript安装及其环境搭建
    安装完成以后,接着输入命令
    TypeScript安装及其环境搭建
    查看typescript编译器的版本信息,代表安装成功

  3. 创建一个ts文件并运行

    nodePad++ 安装包
    链接: https://pan.baidu.com/s/1YTb2NNK7HQ6YELlIxms0mg?pwd=3s8v 提取码: 3s8v
    复制这段内容后打开百度网盘手机App,操作更方便哦
    TypeScript初步入门使用
    使用tsc new.ts 生成一个.js文件
    TypeScript初步入门使用
    使用 node new.ts 运行ts文件
    TypeScript初步入门使用

TypeScript类型声明

强类型定义语言在数度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

  1. 单个声明类型、多个类型声明
    //单个声明类型var [变量名] : [类型];var a: let a:number;
    //多个类型声明var [变量名]:[类型1]|[类型2]let c:boolean|string;c = truec = "hello"
    
  2. 任意类型声明
    //任意类型,如果不指定类型,则ts解析器会自动判断变量的类型为any(隐式的any)//方式一、var [变量名] = 值;//方式二、let [变量名] :[any]let d:any;  //任何类型d = 1;d = "1"d = true;
    
  3. 函数类型声明
    	// 函数类型function sum(a:number,b:number):number{//a,b只能是number类型,返回类型必须是number}function sum(a:number,b:number):number:boolen{//返回值类型可以说number或者boolen}//没有返回值函数function fun():void{/** viod 标识空,没有返回值,如果写return 会报错* 可以返回null,undefined*/}// 永远都不会返回结果function fun():never{throw new Error("error")//never表示永远不会返回结果,会报错}//设置函数结构的类型声明 希望d是函数,a,b是number,返回类型numberlet d:(a:number,b:number)=>numberd = function(a:number,b:number):number{return a + b}
    
  4. unknown类型【未知类型】
    	//unknown类型,unknow类型变量不能随便赋值给其他变量,let e:unknowne=10;e="hellow";e=true;let a:string;a=e;  //unknow类型,赋值给其它会报错//如果真的想赋值,可以通过如下方式if(typeof(e)==="string"){a = e}//或者通过类型断言:高数解析器变量的实际类型,跳过报错a = e as stringa = <string>e	
    
  5. 对象类型声明
    	//  {}用来指定对象中可以包含哪些属性let b:{name:string,age?:number  //加一个问好代表这个属性可有可无,可选属性}b = {name:"张三",age:18}b = {name:"张三"}// name必填,[prop:string]:any 任意类型的属性let c:{name:string,[prop:string]:any}c = {name:"李四",a:1,b:2,c:"aaaa"};
    
  6. 数组类型声明
    	//格式// Array<类型>// string[]表示字符串数组let arr:string[];arr = ['a','b','c']//数值类型let arr2:Array<number>arr2 = [1,2,3]
    
  7. 元组
	元组,元素就是固定长度的数组语法: [类型,类型,类型]let h : [string,string]h = ["1","2"]
  1. 枚举
//所有可能情况列举出来enum Gender{Male = 0,Fenake = 1}let i : {name:string,gender:Gender}i={name:"孙悟空",gender:Gender.male}console.log(i.gender === Gender.Male)// &表示同时满足类型let j : {name:string} & {age:number}//类型别名 简化类型的使用type myType = 1|2|3|4|5;let k : myType;let l : myType;let m : myType;

TypeScript编译选项

  1. 自动编译文件

    编译文件时,使用-w指令后,ts编译器会自动监视文件的变化,并在文件发生变化的时候对文件进行重新编辑。

    tsc xxx.ts -w
    
  2. 自动编译整个项目

    tsc
    

    但是,使用tsc的前提,是要在项目根目录下创建一个ts的配置文件 tsconfig.json,添加完成后,只需要tsc命令就可以对整个项目的ts文件进行编译。

tsconfig.json是ts编译器的配置文件,可以根据他的信息可以对代码进行编译。配置如下
1. “include”:用来指定哪些ts文件需要编译
     ** 表示任意目录
    * 表示任意文件
    例如:“include”:[“./src/**/*”]
2. “exclude” 不需要被编译的文件目录

    例如:“exclude”:[".src/hello/**/“]
3.“extends” 继承 其他的配置文件
    *例如:“extends”:”./config/base"
4.“files” 用来指定被编译的文件的列表,只需要编译的文件少时才会用到。
    “files”:[
        “code.te”,
        “hellow.ts”,
        “binder.ts”
    ]
5.“compilerOptions” 编译选项是配置文件中非常重要也比较复杂的配置选项,在compilerOptions中包含了许多哥子选项,用来完成对编译器的配置。
“compilerOptions”:{
       “target”:“ES6”, //通设定ts被编译的ES的版本
       “module”:“commonjs”, //指定要使用的模块化的规范
       “lib”:[“dom”], //用来指定项目中的要使用的库
       “outDir”:“./dist”, //用来指定编译后文件所在的目录
       “outFile”:“./dist/app.js”, //将代码合并成一个文件,设置outFile后,所有的全局作用域中的代码会合并到同一个文件中
       “allowJs”:false, //是否对JS文件进行编译,默认是false
       “checkJs”:false, //是否检查JS代码符合语法的规范,默认是false
       “removeComments”:true, //编译时候是否移除注释
       “noEmit”:false, //不生成编译后的文件
       “noEmitError”:true, //当有错误时候不生成编译后的文件
       “alwaysStrict”:false, //用来设置编译后的文件是否使用严格模式,默认false
       “noImplicitAny”:false //不允许隐式的数据类型
}

添加tsconfig.json文件
可以使用tsc或者tsc -w进行运行,生成js文件,

TypeScript编译选项

WebPack打包TS代码

  1. 首先下载依赖,在集成终端打开后:
	npm init -ytsc --init 产生对应的ts.config.js文件npm install -D typescriptnpm install -D webpack@4.41.5 webpack-cli@3.3.10npm install -D webpack-dev-server@3.10.2                     启动开发服务器的npm install -D html-webpack-plugin@4.0.0-alpha clean-webpack-plugin     对html内容进行打包 / 清除之前打包好的js文件npm install -D ts-loader@8.0.11                                  针对ts文件进行编译处理npm install -D cross-env                                  涉及跨平台命令
  1. 配置打包命令:
	"dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.js","build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
  1. 创建build文件夹里面webpack.config.js配置如下:
	const {CleanWebpackPlugin} = require('clean-webpack-plugin')const HtmlWebpackPlugin = require('html-webpack-plugin')const path = require('path')const isProd = process.env.NODE_ENV === 'production' // 是否生产环境function resolve (dir) {return path.resolve(__dirname, '..', dir)}module.exports = {mode: isProd ? 'production' : 'development', //模式:生产模式还是开发模式entry: {app: './src/main.ts' //程序主入口目录},output: {path: resolve('dist'), //将打包好的文件放到dist目录里面filename: '[name].[contenthash:8].js' //产生的js文件是以app加上8位的哈希值.js来命名的},module: {rules: [	//rules主要是通过ts-loader这个包针对于ts文件,针对src目录里面的ts和tsx文件进行编译处理操作{test: /\.tsx?$/,use: 'ts-loader',include: [resolve('src')]}]},plugins: [new CleanWebpackPlugin({ //会将dist目录中以前打包的js文件进行清楚}),new HtmlWebpackPlugin({ //针对于./public/index.html进行打包的template: './public/index.html'})],resolve: {extensions: ['.ts', '.tsx', '.js'] //针对于'.ts', '.tsx', '.js'这三种文件进行处理引入文件可以不写他的扩展名},//针对于代码的错误提示devtool: isProd ? 'cheap-module-source-map' : 'cheap-module-eval-source-map',devServer: {host: 'localhost', // 主机名stats: 'errors-only', // 打包日志输出输出错误信息port: 8081, //端口open: true //自定打开浏览器},}
  1. 最后创建src目录下的main.ts:
	document.write('Hello Webpack TS!') npm run dev后在主页面中成功查看hellowebpackTS就说明成功运行 

TS面向对象

  1. 定义类
class 类名 {属性名: 类型;constructor(参数: 类型){this.属性名 = 参数;}方法名(){....}
}
  1. 修饰符

static 静态属性,通过类即可直接使用,不能被子类共享
readonly 只读属性无法修改
public 默认值,可以在类、子类和对象中修改
protected 可以在类、子类中修改
private 可以在类中修改

	constructor(public name: string, public age: number) {} 可以直接将属性定义在构造函数中://语法糖:name: string;age: numberconstructor(name: string, age: number) {this.name = name;this.age = age;}//Singleton 类class Order {count: number = 0private static instanceRef: Orderprivate constructor() { }static getInstance(): Order {if (Order.instanceRef === undefined)Order.instanceRef = new Order()return Order.instanceRef}}// const order = new Order()=> 构造函数是私有的,仅可在类声明中访问。const order1 = Order.getInstance()const order2 = Order.getInstance()order1.count++; order2.count++;console.log(order1.count) //2console.log(order2.count) //2
//----------------------------------Order有一个private构造函数,不能用new实例化 Order,在 static getInstance()中完成调用该类构造函数,这是调用该方法的唯一途径,两次 console.log 都是打印 2,因为只有一个 Order 的实例。若想创建一个自身不能被实例化而子类能被实例化的类时,可以用 protected 修饰构造函数。class OrderItem extends Order {pid: stringconstructor(pid: string, count: number) {super()this.productid = productid}}
  1. 方法重载
    声明多个同名的方法,但只能统一实现,结合条件判断,使用 | 表明多个类型的返回值。若声明方法的代码去掉,代码仍然正常运行,或者干脆设置不同的方法名。
    重载目的:提供从参数类型到返回值类型的合适的映射。
    应用场景:重载构造函数。

重构构造函数 < = > 用接口表示可能的参数 obj,constructor(properties?: 接口名){}

class Product {getProducts(): voidgetProducts(id: number): voidgetProducts(id?: number): void {if (typeof id == 'number'){console.log(`Getting the product info for ${id}`)}else {console.log('Getting all products')}}
}

运行效果:
TS TypeScript基础 前端 面向对象
TS TypeScript基础 前端 面向对象

  1. 抽象类
    抽象类是专门用来被其他类所继承的类,它只能被其他类所继承不能用来创建实例。
    抽象方法,抽象方法没有方法体只能定义在抽象类中,继承抽象类时抽象方法必须要实现
abstract class Animal{abstract run(): void;bark(){console.log('动物在叫~');}
}
class Dog extends Animals{run(){console.log('狗在跑~');}
}
  1. 接口
    再JS中并没有接口概念,接口interface通俗的来说就是对类中的属性和方法进行统一的类型声明,哪个类调用此接口,在一般情况下具有接口中相应的类型声明的属性和方法,接口中的属性和方法名后添加表示属性或方法是可选项,调用接口的类中可以根据具体的需要进行声明,一个类可以实现多个接口的调用,不同的接口用逗号隔开,需要注意的是,接口中声明的方法默认是抽象方法,也就是不具备方法体,需要我们调用接口的时候进行方法重写。
	type myType = {name: string,age: number};const obj: myType = {name: 'sss',age: 111};
	Interface myInterface {name: string;age: number;}const obj: myInterface = {name: 'sss',age: 111 };

上面代码中,进行了type和interface的比较

不能创建多个同名type,但是可以创建多个同名接口,采取合并策略。
接口用来定义一个类的结构,该类应该包含的属性/方法(不能同时),也可以当成类型声明。
接口只定义对象的结构,不考虑实际值。
在接口中,所有的属性都不赋实际值,所有的方法都是抽象方法。
不能在联合或交叉中使用接口类。

	interface Person {age: number}interface Customer {n	ame: string}type cust = Person | Customer √interface cust = Person | Customer ×
  1. 接口实现
    一个类可以实现多个接口,用逗号隔开
	class MyClass implements myInter{constructor(public name: string) {this.name = name;}sayHello(){console.log('大家好~~');}}
  1. 扩展接口
	interface B extends A{声明 B 新增的方法}
  1. getter 和 setter
    在类中定义一组读取 getter、设置属性 setter 的方法,被称为属性的存取器。
	private _name: string;private _age: number;constructor(name:string, age: number) {this._name = name;this._age = age;}get name(){return this._name;}set name(value: string){this._name = value;}get age(){return this._age;}set age(value: number){if(value >= 0){this._age = value}}

此时可以修改 per.name = ‘猪八戒’; per.age = -33;否则若为定义存取器,会报错。

  1. 泛型
    (1),繁星差异:当x类可用,就可使用与X类兼容的其他对象或子类,即泛型差异适用于结构相同的对象。
    (2),不指定泛型,TS可以自动对类型进行推断。
    	function fn<T>(a: T): T{  //=> 箭头函数:const fn = <T>(a: T):T =>{……}return a;}fn('huahua')  //自动识别为string
    
    (3),泛型可以同时指定多个,一般 T 表示类型,K 表示键,V 表示值。
    function fn2<T, K>(a: T, b: K):T{console.log(b);return a;
    }
    fn2<number, string>(123, 'hello');
    
    (4),T extends Inter 表示泛型 T 必须是 Inter 实现类(子类)
    	interface Inter{ length: number }function fn3<T extends Inter>(a: T): number{return a.length;}
    
    (5),类和接口中同样可以使用泛型
     调用使用泛型的类或接口时,必须指定类型,若不确定类型 →
     Solve:any 类型,extends A 或 > 声明默认参数类型 class A <T = any> 哑元类型,class A < T= {}>
     实例——接口用于比较矩形大小和员工工资。
    实例——接口用于比较矩形大小和员工工资。
	interface Comparator<T> {compareTo(value: T): number;}class Rt implements Comparator<Rt>{constructor( private width: number, private height: number){}compareTo(value: Rt): number {return this.width * this.height - value.width * value.height}}class Pg implements Comparator<Pg>{constructor( public name: string, private salary: number) {}compareTo(value: Pg): number {return this.salary - value.salary;}}const rect1: Rect = new Rect(2, 5);const rect2: Rect = new Rect(2, 3);rect1.compareTo(rect2)>0?console.log("rect1 is bigger"):(rect1.compareTo(rect2)== 0 ? console.log("rects are equal") :console.log("rect1 is smaller"))const prog1: Pg = new Pg("John", 20000);const prog2: Pg = new Pg("Alex", 30000);prog1.compareTo(prog2) > 0 ?console.log(`${prog1.name} is richer`) :prog1.compareTo(prog2) == 0 ?	console.log(`earn the same amounts`) :	console.log(`${prog1.name} is poorer`)

类装饰器

(1) 参数——类的构造函数
(2) 类装饰器返回类型为 void,不会替换类声明(观察类)。返回新函数,会修改构造函数。

	Eg:观察类function whoAmI (target: Function): void{console.log(`You are: ${target} `)}@whoAmIclass Friend {constructor(private name: string, private age: number){}}
	观察类 2function UIcomponent (html: string): Funcion {console.log(`The decorator received ${html} \n`);return function(target: Function) {console.log(`A UI component from \n ${target}`)}}@UIcomponent('<h1>Hello Shopper!</h1>')class Shopper {constructor(private name: string) {}}

(3)修改类声明的装饰器:

// 使用类型 any[]的 rest 参数,可以混合其他有构造函数的类
type constructorMixin = { new(...args: any[]): {} };
function useSalutation(salutation: string) {return function <T extends constructorMixin>(target: T) {return class extends target {name: stringprivate message = 'Hello ' + salutation + this.namesayHello() { console.log(`${this.message}`); }}}
}// 运行时 tsc ***.ts --target ES5 -w --experimentalDecorators@useSalutation("Mr. ")class Greeter {constructor(public name: string) { }sayHello() { console.log(`Hello ${this.name}`) };}const grt = new Greeter('Smith');grt.sayHello(); => Hello Mr. Smith

(4)函数装饰器

(1) target 引用定义函数的实例类的对象propertyKey 被装饰的函数的名称descriptor 被装饰的函数的标识符,含一个 value 属性,存储被装饰函数的原始代码。修改该属性,可以修改被装饰函数的原始代码。function logTrade(target, propertyKey, descriptor) {descriptor.value = function () {console.log(`Invoked ${propertyKey} providing:`, arguments);}}class Trade {@logTradeplaceOrder(stockName: string, quantity: number, operation: string, tradedID: number) {}}const trade = new Trade();trade.placeOrder('IBM', 100, 'Buy', 123);=> Invoked placeOrder providing: [Arguments] {'0':'IBM','1':100,'2':'Buy','3': 123}

(5)执行顺序

属性 > 方法 > 方法参数 > 类,多个同样的装饰器,它会先执行后面的装饰器。
// 类装饰器
function anotationClass(id) {console.log('anotationClass evaluated', id);return (target) => console.log('Class executed', id);
}
// 方法装饰器function anotationMethods(id) {console.log('anotationMethods evaluated', id);return (target, property, descriptor) => console.log('Methods executed', id);}@anotationClass(1)@anotationClass(2)class Example {@anotationMethods(1)@anotationMethods(2)method() { }}// Methods evaluated 1// Methods evaluated 2// Methods executed 2// Methods executed 1// Class evaluated 1// Class evaluated 2// Class executed 2// Class executed 1

映射类型

1.Readonly:只读映射类型,将先前声明的类型的所有属性都调整为 Readonly。

原理 :type Readonly<T> = {	//索引类型查询,表示属性名的联合Readonly [P in keyof T]: T[P]  //表示将给定类型 T 的所用属性联合给 P,T[p]是查询类型,表示类型为 T[p]的属性。} Eg:interface Person {name: stringage: number}type propNames = keyof Person // type propNames = "name"|"age"type propTypes = Person[propNames] // type propTypes = string | numberconst worker: Person = { name: 'John', age: 22 }function doStuff(person: Readonly<Person>) {person.age = 25 =>无法分配到 "age" ,因为它是只读属性。}keyof 和 T[p] 应用interface Person {name: string;age: number;}const persons: Person[] = [{ name: 'John', age: 32 },{ name: 'Mary', age: 33 },];function filterBy<T, P extends keyof T>(property: P,value: T[P],array: T[]) {return array.filter(item => item[property] === value);}console.log(filterBy('name', 'John', persons));console.log(filterBy('lastName', 'John', persons)); // errorconsole.log(filterBy('age', 'twenty', persons)); // error

2.Partial:

	//所有属性可选,原理 →type Partial<T> = {[P in keyof T]?: T[P]}

3.Required

	//所有属性都必须,原理 →type Required<T> = {[P in keyof T]-?: T[P]}

4.Pick

	//选择给定类型属性的子集声明新类型type Pick<T, K extends keyof T> ={[P in K]: T[P]}

5.多个映射类型

	Readonly<Partial<Person>>

6.自定义

	type Modifiable<T> = {-readonly [P in keyof T]: T[P]}type NewPromise<T> = T extends (...args: infer A) =>infer R ? (...args: A) => Promise<R> : T;type Promisify<T> = {[P in keyof T]: NewPromise<T[P]>}

条件类型

1.T extends U ? X : Y

含义:检查是否 T 可以分配给 U,如果为真,则使用类型 X,否则使用类型 Y。

2.Exclude 类型

原理: type Exclude<T, U> = T extends U ? never : T 含义:若果 T 不能分配给
U,这保留它,否则过滤掉它。 Eg:删除 Person 类型中的 name 和 age 属性。

class Person {id: number;name: string;age: number;
}
type RemoveProps<T, K> = Exclude<keyof T, K>
type RemainingProps = RemoveProps<Person, 'name' | 'age'>;
<=> 'id' | 'name' | 'age' extends 'name' | 'age' ? never : 'id' | 'name' | 'age' <=> RemainingProps = 'id'
type PersonBlindAuditions = Pick<Person, RemainingProps>;
<=> 表示 Person 类属性子集的联合被重新声明新类型
<=> 结果 type PersonBlindAuditions = { id: number}

3.infer 关键字

type ReturnType = T extends (…args: infer A) => infer R ?
含义:该类型是一个函数,参数为任意数量的 infer A 类型,返回值为 infer R 类型。 应用:将类中的方法转化为异步方法

	interface SyncService {baseUrl: string;getA(): string;}type ReturnPromise<T> =T extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : T;type Promisify<T> = {[P in keyof T]: ReturnPromise<T[P]>;};class AsyncService implements Promisify<SyncService> {baseUrl: string;getA(): Promise<string> {return Promise.resolve('');}}let service = new AsyncService();let result = service.getA(); // hover answer——let result: Promise<string>

相关文章:

TypeScript入门指南

TypeScript学习总结内容目录&#xff1a; TypeScript概述 TypeScript特性。Javascript与TypeScript的区别 * TypeScript安装及其环境搭建TypeScript类型声明 * 单个类型声明&#xff0c;多个类型声明 * 任意类型声明 * 函数类型声明 * unknown类型…...

excel中定位条件,excel中有哪些数据类型、excel常见错误值、查找与替换

一、如何定位条件 操作步骤&#xff1a;开始 - 查找和选择 - 定位条件&#xff08;ctrl G 或 F5&#xff09; 注&#xff1a;如果F5不可用&#xff0c;可能是这个快捷键被占用了 案例&#xff1a;使用定位条件选择取余中空单元格&#xff0c;填入100&#xff0c;按组合键ct…...

19c_ogg搭建

1.环境介绍 源端&#xff1a;192.168.56.101 目标端&#xff1a;192.168.56.100 背景&#xff1a;数据从主库cdb主机定位&#xff0c;同步到从库 2.配置ogg 2.1 开启归档、强制日志、补充日志 --ogg 主备都需要配置 SQL> alter database archivelog; SQL> alter databa…...

网络通信原理网络层TCP/IP协议(第四十三课)

1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网关的地址,网络的出口 3.IP地址 …...

yolov5封装进ros系统

一&#xff0c;要具备ROS环境 ROS环境搭建可以参考我之前的文章 ROS参考文章1 ROS参考文章2   建立ROS工作空间 ROS系统由自己的编译空间规则。 cd 你自己想要的文件夹&#xff08;我一般是home目录&#xff09; mkdir -p (你自己的文件夹名字&#xff0c;比如我是yolov5…...

Flowable 源码目录结构

title: Flowable 源码目录结构 date: 2023-8-17 23:47:20 tags: - Flowable 下载源码 下载地址&#xff1a;flowable/flowable-engine at flowable-6.7.2 (github.com) Git 下载方式&#xff1a;git clone gitgithub.com:flowable/flowable-engine.git 切换分支 git checkout -…...

科大讯飞星火模型申请与chatgpt 3.5模型以及new bing的对比

科大讯飞星火模型 申请科大讯飞星火认知大模型账号科大讯飞星火认知大模型使用1.界面介绍2. 在编程能力上与chatgpt 3.5对比科大讯飞星火模型chatgpt 3.5模型 3. 在图片生成能力上与new bing对比 总结 申请科大讯飞星火认知大模型账号 注册网址&#xff1a; 科大讯飞星火认知大…...

无涯教程-TensorFlow - 分布式计算

本章将重点介绍如何开始使用分布式TensorFlow&#xff0c;目的是帮助开发人员了解重复出现的基本分布式TF概念&#xff0c;如TF服务器。无涯教程将使用Jupyter Notebook分布式TensorFlow。 第1步 - 导入分布式计算必需的必要模块- import tensorflow as tf 第2步 - …...

python+django+mysql项目实践五(信息搜索)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 信息搜素 输入内容进行搜索,内容有文本类和时间类 文本类需要模糊搜索,包含即检索 时间类需要选取时间范围内的内容 views 利用Q完成对指定内容的检索 检索后按检索内容更新…...

Python Opencv实践 - 图像透射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(rows,cols)#opencv中的透射变换&#xff0c;需要一个3x3透射变换矩阵 #这个矩阵可以通过…...

SpringBoot + Vue 微人事项目(第二天)

昨天做了微人事登录的前端页面和后端接口&#xff0c;实现了前后端接口的对接&#xff0c;输入正确的用户名和密码之后&#xff0c;成功的跳转到home页。现在要做的就是Home页的Title制作 Home页的title制作 使用Element UI中的Container布局容器 复制的代码如下&#xff0c…...

【AIGC】 快速体验Stable Diffusion

快速体验Stable Diffusion 引言一、安装二、简单使用2.1 一句话文生图2.2 详细文生图 三、进阶使用 引言 stable Diffusion是一款高性能的AI绘画生成工具&#xff0c;相比之前的AI绘画工具&#xff0c;它生成的图像质量更高、运行速度更快&#xff0c;是AI图像生成领域的里程碑…...

Python入门【动态添加属性和方法、正则表达式概述、match函数的使用、常用匹配符、限定符 、限定符使用示例】(二十九)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

《Go 语言第一课》课程学习笔记(四)

构建模式&#xff1a;Go Module 的 6 类常规操作 为当前 module 添加一个依赖 我们如何为一个 Go Module 添加一个新的依赖包呢&#xff1f; 如果我们要为项目增加一个新依赖&#xff1a;github.com/google/uuid&#xff0c;我们首先会更新源码&#xff1a;package mainimpor…...

制定建立商务模式财务及企业管理信息系统的解决方案

1、调查企业对 Internet 的需求&#xff0c;并制定全面规划。由于电子商务的范围相当 广泛&#xff0c;企业在实施电子商务模式财务及企业管理信息系统时&#xff0c;应先调查哪些对于企 业的收益较大&#xff0c;然后进行全面规划&#xff0c;即规划信息化基本平台、后台企业…...

UE Json Operate 解析嵌套数组

演示如何使用 DTJsonOperate 插件&#xff0c;在蓝图中解析嵌套数组。 比如这个Json {"name": [[[1, 2]],[3, 4],[5, 6]] } 操作演示 最后打印 本功能需要插件支持&#xff0c;插件下载地址。...

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…...

Apache Doris 2.0.0 版本正式发布:盲测性能 10 倍提升,更统一多样的极速分析体验

亲爱的社区小伙伴们&#xff0c;我们很高兴地向大家宣布&#xff0c;Apache Doris 2.0.0 版本已于 2023 年 8 月 11 日正式发布&#xff0c;有超过 275 位贡献者为 Apache Doris 提交了超过 4100 个优化与修复。 在 2.0.0 版本中&#xff0c;Apache Doris 在标准 Benchmark 数…...

LeetCode235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 文章目录 [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定一个二叉搜索树, 找到该树中两个指定…...

设计模式——建造者(Builder)模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;又叫生成器模式&#xff0c;是一种对象构建模式 它可以将复杂对象的建造过程抽象出来&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现的对象。建造者模式是一步一步创建一个复杂的对象&#xff0c;…...

Java课题笔记~ SpringBoot概述

问题导入 学习了SpringBoot入门案例之后&#xff0c;感觉对比SpringMVC哪一个更加方便简洁&#xff1f; SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 Spring程序缺点 配置繁琐 依赖设置繁琐 SpringBoot程序…...

python优雅地爬虫!

背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0c;获得元素中的内容&#xff0c;完成。 好家伙&#xff0c;我知道我爬…...

UVM RAL后门访问配置

先给一下大致的代码结构&#xff0c;根据代码结构来描述。 //dut结构 module my_dut(...);my_reg U_REG(......);endmodulemodule my_reg(...);//reg1和reg2是一个reg的两个field&#xff0c;reg3单独是一个regreg [15:0] reg1_q;reg [15:0] reg2_q;reg [31:0] reg3_q;endmodu…...

数学建模之“灰色预测”模型

灰色系统分析法在建模中的应用 1、CUMCM2003A SARS的传播问题 2、CUMCM2005A长江水质的评价和预测CUMCM2006A出版社的资源配置 3、CUMCM2006B艾滋病疗法的评价及疗效的预测问题 4、CUMCM2007A 中国人口增长预测 灰色系统的应用范畴大致分为以下几方面: (1&#xff09;灰色关…...

深入探讨 Oxigen:Rust 实现的并行遗传算法框

第一部分&#xff1a;引言及Oxigen框架概览 随着遗传算法在许多领域&#xff08;如优化、机器学习和人工智能&#xff09;的应用日益增多&#xff0c;其性能和效率成为了关键焦点。Oxigen 是一个用 Rust 语言实现的并行遗传算法框架&#xff0c;其提供了高效的并行计算机制&am…...

Flink-----Standalone会话模式作业提交流程

1.Flink的Slot特点: 均分隔离内存,不隔离CPU可以共享:同一个job中,不同算子的子任务才可以共享同一个slot,同时在运行的前提是,属于同一个slot共享组,默认都是“default”2.Slot的数量 与 并行度 的关系 slot 是一种静态的概念,表示最大的并发上线并行度是个动态的概念…...

算法与数据结构(七)--堆

一.堆 1.堆的定义 堆是计算机科学中一类特殊的数据结构的通常&#xff0c;堆通常可以被看做是一颗完全二叉树的数组对象。 堆的特性 1.它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其他的每一层从左到右都是满的&#xff0c;如果最后一层结点不…...

软件工程概述-架构师(三)

软件工程概述&#xff08;老版&#xff09; 软件开发生命周期&#xff1a; 软件定义时期&#xff1a;包括 可行性研究和详细需求分析过程&#xff0c;任务是软件工程必需完成的目标&#xff0c;具有可行问题分析、可行性研究、需求分析等。软件开发时期&#xff1a;软件的 设…...

华为手机Outlook手机APP无法登录邮箱,提示[2002]错误代码

近期遇到不少华为手机的Outlook APP无法登录邮箱Office365邮箱的案例&#xff0c;并且提示&#xff1a; 错误 出错了。[2002] 经测试&#xff0c;这应该是华为应用市场下载的Outlook版本有问题。 解决方法&#xff1a; 把Outlook卸载之后从微软官网重新下载官网版本去安装&am…...

“深入探究JVM内部结构与工作原理:解析Java虚拟机“

标题&#xff1a;深入探究JVM内部结构与工作原理 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的内部结构与工作原理。我们将介绍JVM的基本组成部分&#xff0c;包括类加载器、运行时数据区和执行引擎。同时&#xff0c;我们将通过一个示例代码来说明…...

windows下redis服务启动及.bat文件中中redis服务的启动

windows windows下redis服务的启动 1、不配置环境变量 找到redis服务的安装目录进入命令行窗口并输入命令redis-server.exe redis.windows.conf2、配置环境变量 将redis安装目录配置在path环境变量中之后就可以在cmd窗口的任意位置输入redis-server命令就可以启动redis服务…...

【学习笔记之vue】 Cannot find module ‘node-sass‘

Cannot find module node-sass方案一&#xff08;不通&#xff09; 下载node-sass组件 >> npm install -g cnpm>>cnpm install node-sass下载时报错 方案二 使用npm下载node-sass组件 >>npm install node-sassok...

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…...

Java寻找数组的中心下标

目录 1.题目描述 2.题解 分析 具体实现 1.题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和…...

ORACLE中判断表是否存在再删除表避免报错与MySql和SqlServer的不同

不同数据库中drop a table if it exists的不同&#xff1a; In MySQL it is pretty easy to drop a table if it exists already. In Oracle and Microsoft’s SQL Server it is a little more complicated. Today I want to present you the solutions for these two DBMS’.…...

解决 Maven 创建 Spring Boot 项目时出现 “Cannot access alimaven“ 错误的方法

系列文章目录 文章目录 系列文章目录前言一、确认 Maven 配置二、创建 Spring Boot 项目三、修改项目的 Maven 配置四、清除 Maven 本地仓库五、重新构建项目总结前言 Maven 是 Java 项目的构建工具,而 Spring Boot 则是用于快速构建 Spring 应用程序的框架。但有时,在创建 …...

设计模式——适配器模式

引入实例 说起适配器其实在我们的生活中是非常常见的&#xff0c;比如&#xff1a;学校的宿舍的电压都比较低&#xff0c;而有的学生想使用大功率电器&#xff0c;宿舍的就会跳闸&#xff0c;然而如果你使用一个适配器&#xff08;变压器&#xff09;就可以使用了&#xff08;…...

如何区分闰年与平年

首先要明白 地球绕太阳运行周期为365天5小时48分46秒&#xff08;合365.24219天&#xff09;&#xff0c;即一回归年&#xff08;tropical year&#xff09;。公历的平年只有365日&#xff0c;比回归年短约0.2422 日&#xff0c;每四年累积约一天&#xff0c;把这一天加于2月末…...

中间件(下)

1、中间件与性能优化的关系&#xff1a; 中间件与性能优化之间存在密切的关系&#xff0c;特别是在构建复杂的分布式系统、处理高并发、实现异步通信等情况下。中间件可以在性能优化方面发挥重要作用&#xff0c;但同时&#xff0c;不当的中间件选择和配置也可能导致性能问题。…...

LVS-DR的RS进行ARP抑制的原因和LVS持久连接配置

一.RS的ARP抑制 1.为什么要抑制 2.如何抑制 &#xff08;1&#xff09;修改/etc/sysctl.conf文件&#xff0c;增加以下内容 &#xff08;2&#xff09;命令行临时设置 二.LVS持久连接 1.客户端持久连接 2.端口持久连接 3.防火墙标记持久连接 一.RS的ARP抑制 1.为什么要…...

【HarmonyOS】codelab在hvigor版本2.4.2上无法运行问题

【关键字】 HarmonyOS、codelab、hvigor 【问题描述】 有cp反馈集成鸿蒙codelab报错。 下载音乐专辑示例文件&#xff08;一次开发&#xff0c;多端部署-音乐专辑&#xff08;ArkTS&#xff09; (huawei.com)&#xff09;后构建项目&#xff0c;显示找不到2.5.0的hvigor。 …...

MySQL- sql语句基础

文章目录 1.select后对表进行修改&#xff08;delete&#xff09;2.函数GROUP_CONCAT()3.使用正则表达式3.DATE_FORMAT()4.count() 加条件 1.select后对表进行修改&#xff08;delete&#xff09; 报错&#xff1a;You can’t specify target table ‘Person’ for update in …...

【目标检测中对IoU的改进】GIoU,DIoU,CIoU的详细介绍

文章目录 1、IoU2、GIoU(Generalized Intersection over Union)3、DIoU4、CIoU 1、IoU IoU为交并比&#xff0c;即对于pred和Ground Truth&#xff1a;交集/并集 1、IoU可以作为评价指标使用&#xff0c;也可以用于构建IoU loss 1 - IoU 缺点&#xff1a; 2、对于pred和GT相…...

【环境配置】Windows10终端和VSCode下能够直接打开Anaconda-Prompt

很多小伙伴在 Windows 下做深度学习开发的时候&#xff0c;遇到终端没有在 Linux 那么方便&#xff0c;那么我们现在就可以来设置一下&#xff1b;这样我们也可以在文件夹内部右键打开终端&#xff0c;也可以在 VS Code 里面新建一个虚拟环境的控制台&#xff1b;这里主要是针对…...

稚晖君人形机器人问世:大模型加持,会自己换胳膊,要上生产线造车

从零开始,不到半年就造出人形机器人,还自带软硬件体系。 大模型技术的新一波浪潮:具身智能,已经有了重要进展。 刚刚,稚晖君的创业公司「智元机器人」开了自己的第一场发布会。 以「天才少年」身份加入华为的稚晖君(彭志辉)于去年底宣布离职创业,人们都在关注他在机器…...

变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践

目录导读 变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践1. 什么是变更通知2. 变更通知的场景分析3. 变更通知的技术方案3.1 变更通知的技术实现方案 4. 变更通知的最佳实践总结5. 参考资料 变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践 1. 什么是变更通…...

亚马逊产品排名关键因素解析,通过测评干预需要具备哪些条件

亚马逊产品排名的高低意味着分配的流量多少以及销量的高低。影响产品排名的因素主要包括以下四个方面&#xff1a; 1. 产品销量 产品销量是反映产品在同类产品销售情况的一个重要指标。它在产品Listing中展示&#xff0c;并且平台每小时会更新一次该排行榜。平台算法认为&…...

leetcode原题:绘制直线(位运算)

题目&#xff1a; 已知一个由像素点组成的单色屏幕&#xff0c;每行均有 w 个像素点&#xff0c;所有像素点初始为 0&#xff0c;左上角位置为 (0,0)。 现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中&#xff0c;再依次存入长度为 length 的一维数组中。 …...

jenkins 安装和通过gitee 拉取PHP项目

#jenkins 安装地址&#xff1a;https://pkg.jenkins.io/redhat-stable/sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum install fontconfig…...

解析TCP/IP协议的分层模型

了解ISO模型&#xff1a;构建通信的蓝图 为了促进网络应用的普及&#xff0c;国际标准化组织&#xff08;ISO&#xff09;引入了开放式系统互联&#xff08;Open System Interconnect&#xff0c;OSI&#xff09;模型。这个模型包括了七个层次&#xff0c;从底层的物理连接到顶…...