Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用语法详解

文章目录

  • 1️⃣ TypeScript常用讲解
    • 1.1 使用
    • 1.2 字符串
    • 1.3 数字
    • 1.3 布尔
    • 1.4 数组
    • 1.5 元组
    • 1.6 枚举
    • 1.7 any
    • 1.8 void
    • 1.9 object
    • 1.10 函数指定返回值的类型
    • 1.11 联合类型
    • 1.12 类型断言
    • 1.13 接口
    • 1.14 函数类型
    • 1.15 类类型
    • 1.16 泛型
  • 2️⃣ 类
    • 2.1 类的基本写法
    • 2.2 类的继承
    • 2.3 类的修饰符
    • 2.4 类的静态属性
    • 2.5 抽象类
    • 2.6 书写接口给类使用
  • 3️⃣ 常用的工具类型
    • 3.1 Record
    • 3.2 Partial
    • 3.3 Required
    • 3.4 Omit
    • 3.5 Pick
    • 3.6 Exclude
  • 优质资源分享

作者:xcLeigh
文章地址:https://blog.csdn.net/weixin_43151418/article/details/134707321


Electron+Ts+Vue+Vite桌面应用系列 :这个系列包括了从桌面应用环境搭建 到 完整项目运行的全过程。展现一个完整的窗体应用程序,包括对数据的增删改查,各种表单的应用,各种路由的应用,登录注册的实现,窗体的放大缩小,列表的应用,内存的应用等。本篇介绍:TypeScript常用语法详解

1️⃣ TypeScript常用讲解

  • TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程)。
  • TypeScript 由微软开发的自由和开源的编程语言。
  • TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。

1.1 使用

在线测试TypeScript脚本

npm install -g typescript  //安装typescript
tsc -v  //查看版本
tsc -init / tsc --init  //初始化
"outDir": "./"  //tsconfig.json,下配置编译到那个目录下

1.2 字符串

    声明变量name,类型为字符串(string);变量age,类型为数字(number),控制台输出 My name is xcLeigh, I am 24 years old!

let name:string = 'xcLeigh'
let age:number = 24  //常量不能被修改,所以它的值就是它的类型
const info = `My name is ${name}, I am ${age} years old!`
console.log(info);

1.3 数字

let n1: number = 520 // 十进制
let n2: number = 1010 // 二进制
let n3: number = 208 // 十六进制

1.3 布尔

let status: boolean = false;
status= true;

1.4 数组

    定义数组的两种方式,里面的数据类型可以是字符串、数字、布尔等类型。

//方式一变量名:数据类型[] = 变量值
let arr1:number[] = [1,2,3,4]
console.log(arr1)
let arr2:object[] = [{},{},{}]
console.log(arr2)
//方式二数组泛型  变量名:Array<数据类型> = 变量值
let arr3:Array<number> = [1,2,3]
console.log(arr3)
let arr4:Array<object> = [{},{},{}]
console.log(arr4)

1.5 元组

    限制数据类型的同时也限制数据数量,元组在类型声明的时候规定好有几个元素,每个元素分别是什么类型。赋值的时候必须严格按照规则,不能多不能少,同时每个位置的数据类型也要对应上。

let arr5:[number,string,boolean] = [1,'2',true]
console.log(arr5)

1.6 枚举

  • 枚举类型用于定义数值集合。
enum Person {xiaoming,xiaogang,xiaohong
}
let poeple:Person = Person.xiaohong
console.log(poeple)//0
枚举数值默认从0开始依次递增
根据特定的名称得到对应的枚举数值
也可以给定某个名称一个值,后续的名称会在他的基础上递增
enum  Person {
xiaoming  = 100,
xiaogang, //101
xiaohong //102
}
let poeple:Person = Person.xiaogang
//注意有赋值数字后续的名称才会递增,否则只有被赋值的那个名称有值,后续的都是undefined。
enum  Person {
xiaoming  = '123',
xiaogang, //undefined
xiaohong //undefined
}
let poeple:Person = Person.xiaogang

1.7 any

    任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。

1、变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:

let x: any = 1;    // 数字类型
x = 'I am who I am';    // 字符串类型
x = false;    // 布尔类型
x = []; 
x = undefined; 
x = null; 

2、改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:

let x: any = 4;
x.ifItExists();    // 正确,ifItExists方法在运行时可能存在,但这里并不会检查
x.toFixed();    // 正确

3、定义存储各种类型数据的数组时,示例代码如下:

let arrayList: any[] = [1, false, 'fine'];
arrayList[1] = 100;

1.8 void

    用于标识方法返回值的类型,表示该方法没有返回值。某种程度上来说,void 类型像是与 any 类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void

//表示没有任何类型, 一般用来说明函数的返回值不能是undefined和null之外的值 
function fn(): void {console.log('fn()')// return undefined// return null
}

1.9 object

    object 表示非原始类型,也就是除 number,string,boolean之外的类型,并非只是对象类型。

function fn2(obj:object):object {console.log('fn2()', obj)return {}// return undefined// return null
}
console.log(fn2(new String('abc')))
// console.log(fn2('abc') // error
console.log(fn2(String))

1.10 函数指定返回值的类型

    小括号后面接上:数据类型,此写法规定了函数必须要有返回值,并且返回值要符合规定的数据类型

//返回字符串类型
function f():string {return '1'
}
//返回数字类型
function f():number{return 1
}

1.11 联合类型

    通过|符号连接多种数据类型,被赋予此类型的变量可以存储,规定范围内的数据类型的值.

//只要满足申明的联合类型就行let test2:number|string|number[]|null|boolean|undefined = 1test2 = '1'test2 = [1]test2 = nulltest2 = false

1.12 类型断言

    当某个变量可能是多个类型时,此时在使用这个变量的时候可能会发生一些ts的报错。
    比如下面例子中,str可能是string类型或者number类型,那么在函数体里直接使用str.length就会引发ts报错,因为number并没有length属性,此时就可以通过断言来告诉ts我确定这个变量是某个类型,可以放心使用。

  • 语法一:<类型>值
function myFun(str:string|number):number{if((<string>str).length){return (str as string).length}else{return str.toString().length}
}
  • 语法二:(值 as 类型)
function myFun(str:string|number):number{if((str as string).length){console.log(0);return (str as string).length}else{console.log(1);return str.toString().length}
}
console.log(myFun(123));  //输出  1 3
console.log(myFun("123")); //输出  0 3

1.13 接口

    接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。

//通过接口约束的变量必须含有接口内指定的必选属性,
//带问号的属性表示可有可无,可以在变量初始化时传入也可以在初始化之后新增
interface IPerson {readonly id:numbername:stringsex:stringage?:number
}
let person:IPerson = {id:1,name:1+'',sex:'18',
}
person.age = 6

1.14 函数类型

    函数是一组一起执行一个任务的语句。
    您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
    函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

//函数类型,就是一个只有形参和返回值的表达式,他约束了函数的形参类型和返回值类型
interface Hanshu {(name:string,age?:number):void
}
let fun:Hanshu = function (name) {console.log(name)return name
}
fun('我输出了')

1.15 类类型

    TypeScript 是面向对象的 JavaScript。类描述了所创建的对象共同的属性和方法。TypeScript 支持面向对象的所有特性,比如 类、接口等。
    通过implements关键字去指定一个类的接口,这个类必须按照接口的约定来定义自身属性,同时接口和接口之间还可以通过extends 来继承其他接口的约束。

interface IsFly {fly():void
}
//声明一个类,受IsFly接口约束
class bird implements IsFly{fly(){console.log('飞飞飞')}
}
let b = new bird()
b.fly()
interface ISswim {swim():void
}
class fish implements ISswim{swim(){console.log('游泳')}
}
let f = new fish()
f.swim()
//实现一个接口,继承以上两个接口
interface flyandswim extends ISswim,IsFly{say():void
}
class me implements flyandswim{fly(){console.log('test')}swim(){console.log('test1')}say(){console.log('我的接口继承了其他两个接口')}
}
let a = new me()
a.fly()
a.swim()
a.say()

1.16 泛型

    当我们在定义一个函数,类,接口等等东西的时候我们可能并不能预先知道他是一个什么类型,而是需要在调用时动态的传入来确定类型。这个时候就会用到泛型。
    可以简单的理解为函数的参数一样,你传入的是什么类型,那他就是什么类型。

//这就是一个泛型函数,用一个T占位,传入了string之后那用到了T的地方都会被约束为string类型
function fanxing<T>(name:T):T {console.log(name)return name
}
fanxing<string>('泛型测试')//泛型约束,如下会报错,他不知道name的类型
function fanxing<T>(name:T):T {console.log(name)console.log(name.length);return name.length
}
fanxing<string>('泛型测试')  //报错//调用函数时传入的类型必须有length属性
function fanxing<T extends {length:number}>(name:T):any {console.log(name)console.log(name.length);return name.length
}
fanxing<string>('泛型测试')  //输出结果 "泛型测试"  4

2️⃣ 类

2.1 类的基本写法

// 定义类的同时,会生成一个同名的接口
class Person {// 定义属性前,应该先声明这个属性的类型,也可以设置默认值// 这里的myName决定的是下面 this.myName 接收的参数类型myName:string = "默认名称";constructor(name:string) {this.myName = name}getName() {return this.myName}
}
let b=new Person("我是新名称");
console.log(b.getName());  //输出我是新名称// 上面的这个类,相当于下面这个接口
interface Person {myName:string;getName: () => string
}
let obj:Person = {myName: '',getName() {return ''}
}

2.2 类的继承

class Person {myName:stringconstructor(name:string) {this.myName = name}
}
class Man extends Person {age:numberconstructor(name:string, age:number) {// super相当于调用父类的构造函数(执行父的constructor)super(name)this.age = age}
}
let m = new Man('xiaotian', 19)

2.3 类的修饰符

    在类里定义的属性,默认的修饰符就是public,public修饰的属性或方法可以在类的内部、外部以及子类访问。

  • protected 受保护的,类的里面,子类可以访问,外部不能访问
  • private 私有的,只能在该类里才能访问,子类和类外面不能访问
  • readonly 只读
class Person {// 在属性或方法前写修饰符,公共的,只读的myNamepublic readonly myName:stringconstructor(name:string) {this.myName = name}public getName() {return this.myName}
}

2.4 类的静态属性

class Person {public readonly myName:stringstatic title:string = '这是title的值' // 静态属性constructor(name:string) {this.myName = name}public getName() {return this.myName}
}
// 只能通过类去访问/修改
console.log(Person.title);
Person.title = '这是修改后title的值'
console.log(Person.title);
let p = new Person('xiaotian')
// console.log(p.title); // 报错,静态属性不能通过实例对象访问

2.5 抽象类

    abstract 抽象类:是普通类的描述,制定一个类的规范,给普通类去继承,继承之后,普通类里面就必须定义抽象类里面的抽象属性和抽象方法。抽象类里面的普通方法可以直接继承,在普通类里面不用实现.

abstract class Person {// 抽象属性abstract name:string// 抽象方法abstract getName(): number// 也可以写普通方法的 ...getAge() {return 19}
}// 普通类
class Man extends Person {name:string = '默认值'getName() {return 1}
}let m = new Man()
// let p = new Person() // 报错,抽象类不能被实例化

2.6 书写接口给类使用

interface PerItf {name:string;age?:number;  // 可以缺省getName: () => void
}
// 实现接口
class M implements PerItf {name:string = 'xiaotian';age:number = 19;getName() {}
}
let man = new M()

3️⃣ 常用的工具类型

3.1 Record

    如果你想用一组types类型的keys属性来构造一个对象类型,那么Record是最好的工具类型。

type UserID = string// 定义有效的用户信息类型
type UserInfo = "name"|"email"|"avatarUrl"const users: Record<UserID, UserInfo> = >{  "uid1": {"name":"user1", "email":"user1@163.com", "avatarUrl":"https://user1.com/avatar.png"},  "uid2": {"name":"user2", "email":"user1@qq.com", "avatarUrl":"https://user2.com/avatar.png"},  "uid3": {"name":"user3", "email":"user1@gmail.com", "avatarUrl":"https://user3.com/avatar.png"}}

    当你想创建一个对象类型来存储用户的信息,这里你可以使用Record工具类型来实现相同的目的。
    如果你想要添加任何UserInfo类型中不存在的其他类型,TypeScript就会给出编译错误。

3.2 Partial

    当你希望使用现有类型,但又希望所有属性都是可选的时候,Partial工具类型则非常有用。

interface User{  
id: string;  name: string;  slug: string;  group: string;  avatarUrl: string;  about:string;}
const updateUser: Partial<User> = {  about: "我是一个刚学编程的小菜鸡!"
}

    假设你想要更新用户的一个属性,并且你已经有了一个具有所有必须属性的用户界面,但你不想创建一个用于更新用户信息的单独页面。使用Partial实用程序,你就可以动态创建具有所有可选属性的类型。

3.3 Required

    Required 工具类型与 Partial工具类型完全相反,当你希望使用现有类型,但有希望所有属性都是必需的,它就非常的有用。


type User = {firstName: string,lastName?: string
}const user1: Required<User> = {firstName: "John",lastName: "Doe"  //上面lastName虽然缺省了,可以不用输入,但是Required又要求必须输入了
}

    在某些情况下,您可能希望强制一个对象具有所有必需的属性,即使原始类型将其中一些属性定义为可选的。

3.4 Omit

    Omit工具类型可以通过省略另一个对象类型中的特定属性来创建对象类型。
    假设你一个具有一些属性X、Y和Z的对象类型用户。如果您想创建一个没有属性Z的对象类型,那么可以使用Omit工具类型。

type Product = {X: string;Y: string;Z: string;
}type ProductWithoutZ = Omit<Product, "Z">;

3.5 Pick

    使用Pick实用工具类型,您可以从现有类型中选择属性来创建新类型。
    当你有一个子组件,它的一些属性与父组件相同时,你可以通过选择这些属性来为子组件创建一个类型。


type ParentType = {X: string;T: number;S: boolean;
}type ChildType = Pick<ParentType, "X" | "S">

3.6 Exclude

    当使用联合类型时,通常希望只对某些成员使用联合类型,而不是对所有成员,那么你就可以使用Exclude实用程序来实现相同的效果。

type ReactionUnion ="A"|"B"|"C"|"D"
type OnlyThumbsUnion = Exclude<ReactionUnion ,"B"|"C"|"D">
--------------- 本 篇 ---------------

请添加图片描述

--------------- 完 结 ---------------

优质资源分享

🧡🧡🧡🧡🤍【总览】程序员前端、后端资源合集

🧡🧡🧡🧡🤍【源码】程序员优质资源汇总

🧡🧡🧡🧡🤍【博主推荐】JAVA SSM框架的后台管理系统(附源码)

🧡🧡🧡🧡🤍【博主推荐】SpringBoot API接口对数据库增删改查,路由,TOKEN,WebSocket完整版(附源码)

🧡🧡🧡🧡🤍【博主推荐】HTML制作一个美观的个人简介网页(附源码)

🧡🧡🧡🧡🤍【博主推荐】html好看的个人简历网页版(附源码)

🧡🧡🧡🧡🤍【博主推荐】html好看的个人主页(附源码)

🧡🧡🧡🧡🤍【博主推荐】html好看的邀请函(附源码)

🧡🧡🧡🧡🤍【博主推荐】html好看的音乐播放器(附源码)

🧡🧡🧡🧡🤍【博主推荐】html好看的拼图小游戏(附源码)

🧡🧡🧡🤍🤍【博主推荐】html好看的拼图验证码(附源码)

🧡🧡🧡🧡🧡【博主推荐】html界面绘制SVG图形(附源码)

🧡🧡🧡🧡🤍【博主推荐】html操作SVG图(附源码)

🧡🧡🧡🧡🤍【博主推荐】html下拉框树形(附好看的登录界面)

🧡🧡🧡🧡🤍【博主推荐】HTML5响应式手机WEB(附源码)

🧡🧡🧡🧡🤍【博主推荐】大数据可视化大屏(源码下载)

🧡🧡🧡🧡🧡【博主推荐】html引用百度地图定位闪烁弹框树形(附源码)

🧡🧡🧡🧡🤍【博主推荐】HTML酷炫动画表白求爱界面(附源码)


请添加图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 加入社区 带你体验马航不孤单

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/134707321(防止抄袭,原文地址不可删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

❤ 下载返回加密解密

❤功能集合 图片下载 方式一 window.open(URL, name, features, replace) // 新窗口的 URL、窗口名称、窗口特性window.open(row.certificateImageUrl,"_blank", "width500,height400") //打开一个新窗口并且指定长宽参数说明&#xff1a; URL&#xf…

数据结构 | 二叉树的概念及前中后序遍历

数据结构 | 二叉树的概念及前中后序遍历 文章目录 数据结构 | 二叉树的概念及前中后序遍历一、树概念及结构1.1 树的相关概念 二、树的表示2.2 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 三、二叉树概念及结构3.1 二叉树的基本概念3.2 二叉树的结构&a…

文档理解的新时代:LayOutLM模型的全方位解读

一、引言 在现代文档处理和信息提取领域&#xff0c;机器学习模型的作用日益凸显。特别是在自然语言处理&#xff08;NLP&#xff09;技术快速发展的背景下&#xff0c;如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息&#xff0c;还包括布局、图…

js查询详情接口控制执行时间的命令

在JavaScript中&#xff0c;可以使用console.time()和console.timeEnd()来控制执行时间的命令。 console.time()用于开始计时&#xff0c;可以指定一个标识符作为参数&#xff0c;用于标识计时器。 console.time(query); // 执行查询操作 console.timeEnd(query); 执行上述代…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NX二次开发UF_MTX2_copy 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_copy Defined in: uf_mtx.h void UF_MTX2_copy(const double mtx_src [ 4 ] , double mtx_dst [ 4 ] ) overview 概述 Copies the 2x2 matrix elements from the source m…

快速排序算法的代码及算法思想

快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;他的时间复杂度为O(nlogn) 算法思想: 通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据小&#xff0c;然后再对这两部分数据分别进行快速排…

js修改浏览器地址栏里url的方法

1、更新url某一参数的值 function updateQueryStringParameter(uri, key, value) {if (!value) { return uri }var re new RegExp("([?&])" key ".*?(&|$)", "i");var separator uri.indexOf(?) ! -1 ? "&" : &q…

模糊C均值聚类(Fuzzy C-means clustering,FCM)的基本概念,详细流程以及广泛应用!

文章目录 1.基本概念2. FCM的详细流程3.FCM的应用 1.基本概念 模糊C均值聚类&#xff08;Fuzzy C-means clustering&#xff0c;FCM&#xff09;是一种软聚类方法&#xff0c;它允许数据点属于多个聚类中心&#xff0c;每个聚类中心都有一个权重。与传统的硬聚类方法&#xff…

Visual Studio 2022分析C#程序内存泄漏

背景 最近我们的项目出现了内存激增的情况&#xff0c;初次探讨&#xff0c;我们发现和机器人发生通信之后&#xff0c;内存会缓慢上升&#xff0c;直到系统崩溃。 例子 由于只是介绍一个简单的方案&#xff0c;所以就写一个比较简单的例子来演示了&#xff0c;代码如下&…

Python实现对Windows注册表的增删改查

首先我们需要安装winreg库 pip install winreg注册表常量 ”winreg“总有很多有用的方法&#xff0c;基本上就是操作注册表中的键值&#xff0c;我们挑几个重要的来说说。首先我们来了解下”winreg“中的各个常量&#xff1a; 1.HKEY_ 常量 winreg.HKEY_CLASSES_ROOT #存…

五要素超声波气象站-气象站小百科

随着科技的发展&#xff0c;人们对气象监测的需求也越来越高。为了满足这一需求&#xff0c;一款全新的五要素超声波气象站应运而生。这款气象站不仅具有高精度的测量能力&#xff0c;而且能够实时监测天气变化&#xff0c;为人们提供准确的气象数据。 一、实时监测&#xff0…

34、故事大全API接口,免费好用

1、前言 故事大全查询API接口&#xff0c;这个是RollToolsApi通用系列接口的其中一个&#xff0c;内部包含了3个小接口&#xff0c;可获取睡前故事&#xff0c;儿童故事&#xff0c;格林童话&#xff0c;安徒生童话&#xff0c;民间故事&#xff0c;益智故事&#xff0c;历史故…

python循环语句和函数

1.使用for循环打印9*9乘法表 for i in range(1, 10):for j in range(1, i1):print(i, "*", j, "", i*j, end"\t")print()结果&#xff1a; 2.使用while循环打印9*9乘法表 i 1 while i < 10:j 1while j < i1:print(i, "*", j…

SSD-Single Shot Detector

文章目录 SSD模型主要改进点模型说明训练Choosing scales and aspect ratios for default boxesMatching strategyTraining objectiveHard negative miningData augmentation实验结果基本网络参数PASCAL VOC2007模型消融实验PASCAL VOC2012COCO推理速度比较前面提到了两种经典的…

moment.js的使用

更多可参见官方文档&#xff1a;Moment.js 中文网 | 开发文档

Java常见的面试题(很基础那种)

这里介绍一下,一些比较基础的Java面试题,比较适合应届生、实习生这些朋友。因为对于刚出来工作的Java工程师,很多企业都偏向招一些基础比较好的苗子回来培养。所以啊,在校的朋友们,一定要在读书期间,多做项目,如果没有实际的项目,可以在github找一些案例来做参考,先模…

koa2项目中封装log4js日志输出

1.日志输出到控制台 npm i log4js -D 封装log4js文件&#xff1a; const log4js require("log4js"); const logger log4js.getLogger();const levels {trace: log4js.levels.TRACE,debug: log4js.levels.DEBUG,info: log4js.levels.INFO,warn: log4js.levels.WAR…

分享83个简历竞聘PPT,总有一款适合您

分享83个简历竞聘PPT&#xff0c;总有一款适合您 83个简历竞聘PPT下载链接&#xff1a;https://pan.baidu.com/s/1iybRAisgWgXhelE1tGpzBw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

awk笔记231129

awk的脚本套路是: awk的脚步部分最好用一对单引号将 ‘BEGIN{} /pattern1/{}…/patternN/{} END{}’ 套起来, 因为常用到$号, $号在单引号中不会被转义, 在双引号中有取值的含义 awk -F 自定义分隔符 BEGIN{开始块} /pattern1/{操作pattern1过滤的行的块} /pattern2/{操作patt…