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.rhkb.cn/news/212361.html

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

相关文章

【算法集训】基础数据结构:三、链表

链表就是将所有数据都用一个链子串起来&#xff0c;其中链表也有多种形式&#xff0c;包含单向链表、双向链表等&#xff1b; 现在毕竟还是基础阶段&#xff0c;就先学习单链表吧&#xff1b; 链表用头结点head表示一整个链表&#xff0c;每个链表的节点包含当前节点的值val和下…

【Python源码保护】02 - pyc

1. python编译过程 Python虽然是一门解释型语言&#xff0c;但Python程序执行时&#xff0c;也需要将源码进行编译生成字节码&#xff0c;然后由Python虚拟机进行执行&#xff0c;因此Python解释器实际是由两部分组成&#xff1a;编译器和虚拟机。 Python程序执行过程和Java类…

C语言--不使用库函数,把一个数字转为字符串【详细解释】

一.题目描述 输入一个数字&#xff0c;把他转为字符串 比如&#xff1a;输入数字&#xff1a;12345 输出&#xff1a;12345&#xff08;这里的12345是字符串12345&#xff09; 二.思路分析 比如给定一个数字12345&#xff0c;先把它转为字符54321&#xff08;“54321”&#…

处理器中的TrustZone之安全状态

在这篇博客中&#xff0c;我们将讨论处理器内对TrustZone的支持。其他部分则涵盖了在内存系统中的支持&#xff0c;以及建立在处理器和内存系统支持基础上的软件情况。 3.1 安全状态 在Arm架构中&#xff0c;有两个安全状态&#xff1a;安全状态和非安全状态。这些安全状态映射…

区块链密码学:基础知识、应用与未来发展

一、引言 区块链技术&#xff0c;作为一种分布式、去中心化的数据管理方式&#xff0c;密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。 二、区块链密码学基础知识 区块链密码学是区块链技术的核心组成部分…

深入理解 Java 虚拟机(JVM)从入门到精通

目录 一、JVM内存结构1、堆&#xff08;Heap&#xff09;&#xff08;1&#xff09;特点&#xff08;2&#xff09;堆内存分配&#xff08;3&#xff09;晋升到老年代的方式&#xff08;4&#xff09;堆内存检验方式2、虚拟机栈&#xff08;VM Stack&#xff09;&#xff08;1&…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志&#xff0c;现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

机械行业解决云存储的企业云盘推荐

随着科技的飞速发展&#xff0c;机械行业在取得显著成果的同时&#xff0c;也面临着一些独特的挑战。本文将深入探讨机械行业所面临的主要问题&#xff0c;并详细介绍Zoho WorkDrive企业云盘所提供的解决方案&#xff0c;以帮助企业应对这些挑战。 一、机械行业面临的主要问题 …

JavaScript添加快捷键、取消浏览器默认的快捷操作、js查看键盘按钮keycode值

document.addEventListener("keydown",function (event) {// 如果不知道按键对应的数字&#xff08;keyCode&#xff09;是多少可以弹出查看一下// alert(event.keyCode)if (event.ctrlKey && event.altKey && event.view["0"] null){if(…

zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日&#xff0c;首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来&#xff0c;共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛&#xff0c;最终有6支队伍脱颖而出&#xff0c;入围了实物赛…

<蓝桥杯软件赛>零基础备赛20周--第9周--前缀和与差分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

Stable Diffusion 系列教程 - 1 基础准备(针对新手)

使用SD有两种方式&#xff1a; 本地&#xff1a; 显卡要求&#xff1a;硬件环境推荐NVIDIA的具有8G显存的独立显卡&#xff0c;这个显存勉勉强强能摸到门槛。再往下的4G可能面临各种炸显存、炼丹失败、无法生成图片等各种问题。对于8G显存&#xff0c;1.0模型就不行&#xff0…

微服务实战系列之EhCache

前言 书接前文&#xff0c;继续深耕。上一篇博主对Redis进行了入门级介绍&#xff0c;大体知道了Redis可以干什么以及怎么使用它。 今日博主继续带着大家学习如何使用EhCache&#xff0c;这是一款基于Java的缓存框架。 微服务实战系列之Redis微服务实战系列之Cache微服务实战…

tomcat环境搭建

镜像下载地址&#xff1a;https://mirror.tuna.tsinghua.edu.cn/apache/tomcat/ 配置环境变量 添加系统变量 编辑Path 测试 dos窗口运行startup启动tomcat 访问http://localhost:8080/

孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

『TypeScript』从零开始编写你的第一个TypeScript程序

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript及为什么使用TypeScriptTypeScript的安装过程编写第一个HelloTs程序 文章目录 一、TypeScript简介1. 什么是TypeScript&#xff1f;2. 为什么选择使用TypeScript&#xff1f;2.1 静态类型检查2.2 更好的代码维护性2.3 更…

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

基于单片机设计的激光测距仪(采用XKC-Kl200模块)

一、前言 随着科技的不断进步和应用需求的增加&#xff0c;测距仪成为了许多领域必备的工具之一。传统的测距仪价格昂贵、体积庞大&#xff0c;使用起来不够方便。本项目采用STC89C52单片机作为主控芯片&#xff0c;结合XKC-KL200激光测距模块和LCD1602显示器&#xff0c;实现…