写给自己的TypeScript知识总结

简介: 写给自己的TypeScript知识总结

TypeScript


为了配合学习Vue3,所以昨天复习了一遍JavaScript,今天就接着学了一遍TypeScript,因为没有涉及到异步Promise那些,所以学起来还算轻松。


1.安装TS并且配置运行环境


一般来说,我们运行.ts文件需要先npm install -g typescript下载,然后使用tsc xxx.ts将ts文件编译为js文件node运行。 但是如果我想直接在WebStorm中运行ts文件,就得另外配置。


首先安装好环境


npm install -D typescript
npm install -D ts-node
npm install -D @types/node
复制代码


配置好运行设置

image.png

然后去插件中安装run configuration for typescript


image.png

重启WebStorm之后就可以像以前一样点击直接运行.ts文件了


image.png


2.一些TS基础知识


2.1 关于数据类型


2.1.1 基础类型


和大多数语言一样,TS的基础数据类型包括布尔值、数值、字符串、nullundefined 以及 ES6 中的新类型 Symbol 和 ES10 中的新类型 BigInt,其中布尔就是boolean、数值用number,字符串用string

除此之外,我们如果想恢复JS的灵活性,可以将数据类型定义为any,也就是可以被赋值为任意类型,就不会出现TS中如果定义为string再赋值为int出错了。当我们定义变量时并没有进行赋值,这个时候TS都会将变量推断为any类型,这样就避免了类型检查,后面也就可以灵活赋值。


image.png

如果开始没有赋值也就不会进行类型推断,后续任何赋值也就不会出错


image.png


2.1.2 联合类型


如果我们就想一个变量能赋值为stringnumber类型,但是不能赋值为其他类型,这其实也是可以的,这就需要使用联合类型

image.png

使用|将两种类型分隔开就可以允许多种类型了


2.1.3 接口


接口之前都是面向对象中定义抽象方法用到的,在TS中除了可以对类的方法进行抽象之外,还可以对属性进行规定。


interface Man{
    name:string
    age:number
}
let a:Man={
    name:"a",
    age:18
}
console.log(a)
复制代码


在这种情况下,我们的赋值变量既不能多一些属性,也不能少一些属性。但是每个人还是有不同点的,所以还需要一些可选的属性。


interface Man{
    name:string
    age:number
    alive?:boolean
}
let a:Man={
    name:"a",
    age:18,
    alive:true,
}
let b:Man={
    name:"b",
    age:99,
}
console.log(a)
console.log(b)


image.png


在这里我们的alive属性就是可选的,这个属性可以不存在,但是还是不能添加属性。没有什么是没办法做到的对吧,之前讲过any可以定义任意类型,当然也可以是不存在的类型。


interface Man{
    name:string
    age:number
    alive?:boolean
    [xxx:string]:any
}
let a:Man={
    name:"a",
    age:18,
    alive:true,
    work:"student"
}
let b:Man={
    name:"b",
    age:99,
    email:"xxxx@xxx.com"
}
console.log(a)
console.log(b)
复制代码


image.png


当然这里面依然可以定义只读属性,只能读取不能修改。


image.png

2.1.4 数组


对于数组的定义可以使用传统的方式,类似于C++中的int[],TS中可以用let arr:number[]=[1,2,3,4],当然也可以用泛型let arr1:Array<number>=[5,10,15]


let arr:number[]=[1,2,3,4]
let arr1:Array<number>=[5,10,15]
arr.push(11)
console.log(arr,arr1)
arr.pop()
console.log(arr)


image.png

2.1.5 函数


有三种定义函数的方式

  • 函数声明
  • 函数表达式
  • =>函数


function sum1(x:number,y:number):number{
    return x+y
}
let sum2=function (x:number,y:number){
    return x+y
};
let sum3=(x:number,y:number)=>x+y;
let a:number=15
let b:number=16
console.log(sum1(a,b))
console.log(sum2(a,b))
console.log(sum3(a,b))
复制代码

image.png


//可选参数以及参数默认值
function Print(str:string,age:number=18,str2?:string){
    if(str2){
        console.log(str+` ${age} `+str2)
    }else{
        console.log(str+` ${age} `)
    }
}
Print("aaa")
Print("bbb",1)
Print("bbb",1,"ccc")

image.png


2.2 常用内容


2.2.1 创建别名


type 新名字=原始数据类型


2.2.2 字面量限制


从创建别名的时候将别名进行限制,使用|这样就可以使别名只能在几个有限的值中选择。


image.png

2.2.3 元祖&枚举


我们利用元祖可以合并不同类型的元素


let person:[string,number]=['aaa',18]
console.log(person)
//单独赋值
let a=[]
a[0]=1
a[1]='aaa'
console.log(a)
//一次赋值时必须同时赋两个值
a=[12,'bbb']
console.log(a)
复制代码

image.png

枚举和其他语言一样,都是可以自增


enum Days{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}
function Print1(){
    for(let i=1;i<=7;i++){
        console.log(Days[i])
    }
}
let names:Array<any>=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
names.forEach((val)=>{
    console.log(Days[val])
})
Print1()

image.png

2.2.4 类与接口


interface Do{
    sleep(h:number):string
}
class Person implements Do{
    name:string
    constructor(name:string) {
        this.name=name
    }
    say(sth:string):string{
        return `My name is ${this.name},and ${sth}`
    }
    sleep(h:number):string{
        return `睡了${h}小时`
    }
}
let a:Person=new Person("aaa")
console.log(a.say("I'm Unhappy!"))
console.log(a.sleep(10))
复制代码


image.png

2.2.5 泛型


function createArray<T>(length:number,value:T[]):Array<T>{
    let result:T[]=[]
    for(let i=0;i<length;i++){
        result[i]=value[i]
    }
    return result
}
console.log(createArray<number>(5,[3,4.5,7,5,1]))
function swap_diff<T,U>(tuple:[T,U]):[U,T]{
    return [tuple[1],tuple[0]]
}
console.log(swap_diff(['aaa',18]))


image.png

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33079 82
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17818 24
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36801 22
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24874 15
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36786 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29925 52

热门文章

最新文章