TypeScript最新语法总结

注意注意!!!本文介绍的是最新的TypeScript4的重要语法

第一部分:TypeScript的简介

TypeScript 是由微软开发的一款开源的编程语言,TypeScript 是 Javascript 的超集,遵循最新的 ES6、ES5 规范,TypeScript 扩展了 JavaScript 的语法。TypeScript 更像后端 Java、C#这样的面向对象语言,可以让 JavaScript 开发大型企业项目。谷歌也在大力支持 Typescript 的推广,谷歌的 angular2.x+ 就是基于 Typescript 语法,最新的 Vue 、React 也可以集成 TypeScript。Nodejs 框架中的 Nestjs、midway 中用的就是 TypeScript 语法。
关于如何安装TypeScript的请参考前文哦……

第二部分:TypeScript4数据类型

小编总结出一共有12种类型(如有纠错,可以在评论区留言哦)。分别是:
1、number类型

let num: number = 100
console.log(num)

2、string类型

let str: string  'Hello'
console.log(str)

3、boolean类型

let flag: boolean = true
console.log(falg)

4、null类型

let n: null = null
console.log(n)

5、undefined类型

let u: undefined = undefined
console.log(u)

6、数组类型

let arr: number[] = [1, 2, 3, 4, 5]
console.log(arr)// 或者使用泛型定义数组(后面会学到泛型)
let arr2: Array<number> = [1, 2, 3, 4, 5]
console.log(arr2)

7、元组类型

let user: [string, number] = ["小黄", 20]
console.log(user)

8、any类型

let flag: any = 1
flag = 'Hi'
flag = true
console.log(flag)

9、void类型(表示没有任何类型,通常用于定义函数的时候函数没有返回值)

function print(): void {console.log("执行了,但是没有返回值!")
}
print()

10、never类型(表示没有任何类型,通常用于定义抛出错误的函数类型)

function error(): never {throw new Error('抛出错误了')
}

11、枚举类型
第一种情况:只有标识符没有赋值,那么属性的值就是该属性的下标

enum Flag {first,second,third
}
let a: Flag = Flag.first
console.log(a)  //值为0

第二种情况:如果标识符已经赋值,那么属性的值就是被赋的值

enum Flag {first,second = 200,third
}
let b: Flag = Flag.second
console.log(b)  //值为200

12、组合类型

let flag: number | string = 100
flag = 'Hello'
console.log(flag)

第三部分:TypeScript4函数

首先,我们先来看看函数的格式,函数通常有两种格式
函数格式一:

function 函数名(参数列表): 返回值类型 {函数体……[return 返回值]
}

函数格式二:

let 函数名 = function(参数列表): 返回值类型 {函数体……[return 返回值]
}

重点!函数的参数类型:
1、必选参数

function getInfo(name: string, age: number): string {return `${name} --- ${age}`
}
console.log(getInfo('张三', 18))  //正确
console.log(getInfo('张三'))  //错误
console.log(getInfo(18))  //错误

2、可选参数
注意!!!可选参数必须放到最后面

function getInfo(name: sqtring, age?: number): string {return `${name} --- ${age}`
}
console.log(getInfo('张三', 18))  //正确
console.log(getInfo('张三'))  //正确
console.log(getInfo(18))  //错误

3、默认参数

function getInfo(name: string, age: number = 20): string {return `${name} --- ${age}`
}
console.log(getInfo('张三', 18))  //正确
console.log(getInfo('张三'))  //正确
console.log(getInfo(18))  //错误

4、剩余参数
注意!!!剩余参数必须放到最后面

function sum(...result: number[]): number {let sum = 0for (let i = 0; i < result.length; i++) {sum += result[i]}return sum
}
console.log(sum(1, 2, 3, 4, 5, 6))
function sum(init: number, ...result: number[]): number {let sum = initfor (let i = 0; i < result.length; i++) {sum += result[i]}return sum
}
console.log(sum(100, 1, 2, 3, 4, 5, 6))

第四部分:TypeScript4的类

1、类的定义

class Person {name: string  //属性,前面省略了public关键词constructor(n: string) {  //构造函数,实例化类的时候触发的方法this.name = n  //使用this关键字为当前类的name属性赋值}run(): void {  //方法console.log(this.name+ "在跑步")}
}
var p = new Person("张三")
p.run()

2、类的继承
类的继承:在 TypeScript 中要想实现继承使用 extends 关键字,只要一旦实现了继承关系,那么子类中便拥有了父类的属性和方法,而在执行方法过程中,首先从子类开始找,如果有,就使用,如果没有,就去父类中找。类的继承只能单向继承。

class Person {name: string  //父类属性,前面省略了public关键词constructor(n: string) {  //构造函数,实例化父类的时候触发的方法this.name = n  //使用this关键字为当前类的name属性赋值}run(): void {  //父类方法console.log(this.name + "在跑步")}
}//中国人这个类继承了人这个类
class Chinese extends Person {age: number  //子类属性constructor(n: string, a: number) {  //构造函数,实例化子类的时候触发的方法super(n)  //使用super关键字调用父类中的构造方法this.age = a  //使用this关键字为当前类的age属性赋值}speak(): void {  //子类方法super.run()  //使用super关键字调用父类中的方法console.log(this.name + "说中文")}
}
var c = new Chinese("张三", 28)
c.speak()

3、类的修饰符
TypeScript 里面定义属性的时候给我们提供了 三种修饰符。
(1)public:公有类型,在当前类里面、子类、类外面都可以访问;
(2)protected:保护类型,在当前类里面、子类里面可以访问,在类外部没法访问;
(3)private:私有类型,在当前类里面可以访问,子类、类外部都没法访问。

注意!!!如果属性不加修饰符,那么就是默认公有(public)

4、类的静态属性
静态属性:被静态修饰符修饰的属性就是静态属性,静态属性可以通过类名直接调用。

class Person {name: string  //属性,前面省略了public关键词static sex: string = "男"  //被静态修饰符static修饰的属性constructor(n: string) {  //构造函数,实例化类的时候触发的方法this.name = n}run(): void {  //方法console.log(this.name+ "在跑步")}
}
console.log(Person.sex)

5、类的静态方法
也是很简单的,静态方法可以通过类名直接调用。

class Person {name: string  //属性,前面省略了public关键词static sex: string = "男"  //被静态修饰符static修饰的属性constructor(n: string) {  //构造函数,实例化类的时候触发的方法this.name = n}run(): void {  //方法console.log(this.name + "在跑步")}static print(): void {  //被静态修饰符static修饰的方法// console.log('姓名:' + this.name)  //错误console.log('性别:' + Person.sex)  //正确// this.run()  //错误}
}
Person.print()

6、抽象类
TypeScript 中的抽象类:它是提供其他类继承的基类,不能直接被实例化。

abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类(也就是其子类)中实现,abstract抽象方法只能放在抽象类里面。

我们常常使用抽象类和抽象方法用来定义标准。

//动物抽象类,所有动物都会跑(假设),但是吃的东西不一样,所以把吃的方法定义成抽象方法
abstract class Animal {name: stringconstructor(name: string) {this.name = name}abstract eat(): any  //抽象方法不包含具体实现并且必须在派生类中实现run() {console.log(this.name + "会跑")}
}class Dog extends Animal {constructor(name: string) {super(name)}eat(): any {  //抽象类的子类必须实现抽象类里面的抽象方法console.log(this.name + "吃骨头")}
}
var d: Dog = new Dog("小狼狗")
d.eat()class Cat extends Animal {constructor(name: string) {super(name)}eat(): any {  //抽象类的子类必须实现抽象类里面的抽象方法console.log(this.name + "吃老鼠")}
}
var c: Cat = new Cat("小花猫")
c.eat()

第五部分:TypeScript4接口

学过Java的同学应该明白接口的干嘛的,没学过也没关系,也是很简单的东西,不要方啦。
接口的用途就是对行为和动作进行规范和约束,跟抽象类有点像,但是,接口中不能有方法体,只允许有方法定义。
接口主要有以下几种:
1、属性类型接口

//这个是一个属性类型接口
interface FullName {firstName: string;secondName: string;
}function printName(name: FullName) {console.log(name.firstName + "--" + name.secondName)
}//传入的参数必须包含firstName、secondName
var obj = {firstName: '张',secondName: '三'
};
printName(obj)

2、函数类型接口

//以下是一个函数类型接口
interface encrypt {(key: string, value: string): string;
}var testFunc1: encrypt = function (key, value) {return key + "----" + value
}
console.log(testFunc1("name", "zhangsan"))var testFunc2: encrypt = function (key, value) {return key + "====" + value
}
console.log(testFunc2("name", "lisi"))

3、可索引型接口

//以下是一个可索引型接口,对数组的约束
interface UserArr {[index: number]: string
}
var arr1: UserArr = ["aaa", "bbb"]
console.log(arr1[0])//以下是一个可索引接口,对对象的约束
interface UserObj {[index: string]: string
}
var arr2: UserObj = { name: '张三', age: '21' }
console.log(arr2)

4、类类型接口

//以下是一个类类型接口,用于对类的约束
interface Animal {name: string;eat(str: string): void;
}class Dog implements Animal {name: stringconstructor(name: string) {this.name = name}eat() {console.log(this.name + "吃大骨头")}
}
var d = new Dog("小狼狗")
d.eat()class Cat implements Animal {name: stringconstructor(name: string) {this.name = name}eat(food: string) {console.log(this.name + "吃" + food)}
}
var c = new Cat("小花猫")
c.eat("大老鼠")

5、接口的继承

//人接口
interface Person {eat(): void;
}//程序员接口
interface Programmer extends Person {code(): void;
}//小程序接口
interface Web {app(): void;
}//前端工程师
class WebProgrammer implements Programmer, Web {public name: stringconstructor(name: string) {this.name = name}eat() {console.log(this.name + "下班吃饭饭")}code() {console.log(this.name + "上班敲代码")}app() {console.log(this.name + "开发小程序")}
}
var w = new WebProgrammer("小李")
w.eat()
w.code()
w.app()

第六部分:TypeScript4泛型

软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据,这样用户就可以以自己的数据类型来使用组件。

通俗理解:泛型就是解决类、接口、方法的复用性、以及对不特定数据类型的支持
泛型主要有以下两种:
1、泛型类

//类的泛型
class MinClas<T>{public list: T[] = []add(value: T): void {this.list.push(value)}min(): T {var minNum = this.list[0]for (var i = 0; i < this.list.length; i++) {if (minNum > this.list[i]) {minNum = this.list[i]}}return minNum}
}
//实例化类并且制定了类的T代表的类型是number
var m1 = new MinClas<number>()
m1.add(11)
m1.add(3)
m1.add(2)
console.log(m1.min())
//实例化类并且制定了类的T代表的类型是string
var m2 = new MinClas<string>()
m2.add('c')
m2.add('a')
m2.add('v')
console.log(m2.min())

2、泛型接口

//泛型接口
interface ConfigFn<T> {(value: T): T;
}function getData<T>(value: T): T {return value
}
var myGetData: ConfigFn<string> = getData
console.log(myGetData('20'))

第七部分:命名空间

命名空间:在代码量较大的情况下,为了避免各种变量命名相冲突,可将相似功能的函数、类、接口等放置到命名空间内,同Java的包、.Net的命名空间一样,TypeScript的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象,命名空间内的对象通过export关键字对外暴露。

namespace A {interface Animal {name: string;eat(): void;}export class Dog implements Animal {name: stringconstructor(theName: string) {this.name = theName}eat(): void {console.log(`${this.name} 吃狗粮。`)}}export class Cat implements Animal {name: stringconstructor(theName: string) {this.name = theName}eat(): void {console.log(`${this.name} 吃猫粮。`)}}
}namespace B {interface Animal {name: string;eat(): void;}export class Dog implements Animal {name: stringconstructor(theName: string) {this.name = theName}eat(): void {console.log(`${this.name} 吃狗粮。`)}}export class Cat implements Animal {name: stringconstructor(theName: string) {this.name = theName}eat(): void {console.log(`${this.name} 吃猫粮。`)}}
}
var ac = new A.Cat("小花")
ac.eat()var bc = new B.Cat("小花")
bc.eat()

好啦,以上就是本次关于最新的TypeScript4的重点总结啦,并不是太难的,希望对大家有所帮助,后续还会继续出文更新有关TS的其他内容哦,欢迎大家在下方留言^^

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

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

相关文章

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力&#xff1a;下一波生产力浪潮》中指出&#xff0c;生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中&#xff0c;「生成式AI」…

动手学深度学习(二)线性神经网络

推荐课程&#xff1a;跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 回归任务是指对连续变量进行预测的任务。 一、线性回归 线性回归模型是一种常用的统计学习方法&#xff0c;用于分析自变量与因变量之间的关系。它通过建立一个关于自变量和因变量的线性方程&…

分布式协议与算法——拜占庭将军问题

拜占庭将军问题 背景&#xff1a;以战国时期为背景 战国时期&#xff0c;齐、楚、燕、韩、赵、魏、秦七雄并立&#xff0c;后来秦国的势力不断强大起来&#xff0c;成了东方六国的共同威胁。于是&#xff0c;这六个国家决定联合&#xff0c;全力抗秦&#xff0c;免得被秦国各个…

JVM面试突击1

JVM面试突击 JDK&#xff0c;JRE以及JVM的关系 我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .java 文件转换成了 .class 文件&#xff0c;实际上就是文件格式的转换&#xff0c;对等信息转换。 类加载机制是什么&#xff1f; 所谓类加载机制就是 虚拟机把Class文…

C语言阶段性测试题

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a;本部分是C语言初阶学完阶段性测试题&#xff0c;最后一道编程题有一定的难度&#xff0c;需要多去揣摩&#xff0c;代码敲多了&#xff0c;自然就感觉不难了&#xff0c;加油&#xff0c;铁汁们&#xff01;&#xff01;&…

YOLO中Anchor生成介绍

Anchor生成机制 YOLOv1YOLOv2YOLOv4模型输出decode1.维度变换2.读取位置信息3.坐标变换4.构建网格5. 计算实际偏移量6.得到输出 YOLOv1 利用全连接层直接对边界框进行预测 YOLOv2 YOLOv2通过缩减网络&#xff0c;使用416x416的输入&#xff0c;模型下采样的总步长为32&#…

flutter开发实战-实现自定义按钮类似UIButton效果

flutter开发实战-实现自定义按钮类似UIButton效果 最近开发过程中需要实现一下UIButton效果的flutter按钮&#xff0c;这里使用的是监听手势点击事件。 一、GestureDetector GestureDetector属性定义 GestureDetector({super.key,this.child,this.onTapDown,this.onTapUp,t…

附件展示 点击下载

效果图 实现代码 <el-table-column prop"attachment" label"合同附件" width"250" show-overflow-tooltip><template slot-scope"scope"><div v-if"scope.row.cceedcAppendixInfoList &&scope.row.ccee…

路由的hash和history模式的区别

目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的&#xff0c;它的目标是不刷新整体页面&#xff0c;通过地址栏中的变化来决定内容区…

SQL 表别名 和 列别名

列表名 列表名之后 order by 可以用别名 也可以用原名&#xff0c; where 中不能用别名的 SQL语句执行顺序&#xff1a; from–>where–>group by -->having — >select --> order 第一步&#xff1a;from语句&#xff0c;选择要操作的表。 第二步&#xff1…

SpringBoot图片上传并对大小进行压缩(缩放比例)

前言 最近有个新需求&#xff0c;项目中对客户上传jpg图片的时候&#xff0c;每次都是校验大小必须≤30KB&#xff0c;但是客户实际使用的时候&#xff0c;总是会自己去进行压缩&#xff0c;压缩到30KB以内之后再上传&#xff0c;使用时间长了之后&#xff0c;客户总会觉得很麻…

react学习笔记——1. hello react

包含的包一共有4个&#xff0c;分别的作用如下&#xff1a; babel.min.js&#xff1a;可以进行ES6到ES5的语法转换&#xff1b;可以用于import&#xff1b;可以用于将jsx转换为js。注意&#xff0c;在开发的时候&#xff0c;这个转换&#xff08;jsx转换js&#xff09;不在线上…

Tcp的粘包和半包问题及解决方案

目录 粘包&#xff1a; 半包&#xff1a; 应用进程如何解读字节流&#xff1f;如何解决粘包和半包问题&#xff1f; ①&#xff1a;固定长度 ②&#xff1a;分隔符 ③&#xff1a;固定长度字段存储内容的长度信息 粘包&#xff1a; 一次接收到多个消息&#xff0c;粘包 应…

HBase概述

HBase 一 HBase简介与环境部署 1.1 HBase简介&在Hadoop生态中的地位 1.1.1 什么是HBase HBase是一个分布式的、面向列的开源数据库HBase是Google BigTable的开源实现HBase不同于一般的关系数据库, 适合非结构化数据存储 1.1.2 BigTable BigTable是Google设计的分布式…

mysql的update_time

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下&#xff1a; DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织&#xff0c;只要有写代码的地方&#xff0c;就有代码版本管理的主场&#xff0c;初入职场&#xff0c;总会遇到第一个拦路虎 git 管理流程&#xff0c;但是每一个企业似乎都有自己的 git 管理流程&#xff0c;倘若我们能掌握…

如何在不使用脚本和插件的情况下手动删除 3Ds Max 中的病毒?

如何加快3D项目的渲染速度&#xff1f; 3D项目渲染慢、渲染卡顿、渲染崩溃&#xff0c;本地硬件配置不够&#xff0c;想要加速渲染&#xff0c;在不增加额外的硬件成本投入的情况下&#xff0c;最好的解决方式是使用渲云云渲染&#xff0c;在云端批量渲染&#xff0c;批量出结…

ABAP 自定义搜索功能 demo1

ABAP 自定义搜索功能 demo1 效果&#xff1a; 双击选中行则为选中对应发票 实现 1定义 定义屏幕筛选参数 SELECTION-SCREEN BEGIN OF SCREEN 9020. SELECT-OPTIONS:s1_belnr FOR rbkp-belnr, s1_gjahr FOR rbkp-gjahr, s1_lifnr FOR rbkp-lifnr, s1_erfna FOR rbkp-erfnam, …

go入门实践二-tcp服务端

文章目录 前言接口与方法并发-协程项目管理bufio包使用其他代码 前言 上一篇&#xff0c;我们通过go语言的hello-world入门&#xff0c;搭建了go的编程环境&#xff0c;并对go语法有了简单的了解。本文实现一个go的tcp服务端。借用这个示例&#xff0c;展示接口、协程、bufio的…

php运算符的短路特性

php运算符的短路特性 1、逻辑运算符&#xff1a;逻辑与&#xff08;&&)和逻辑或&#xff08;||&#xff09;&#xff0c;存在着短路特性 PHP中有以下两个运算符具有短路的特性&#xff0c;他们是逻辑运算符的逻辑与&#xff08;&&)和逻辑或&#xff08;||&am…