精讲typescript从入门到入土
前言
TypeScript是一种由Microsoft开发的编程语言,它是JavaScript的超集,意味着它可以编写与JavaScript完全兼容的代码,并且可以扩展其功能。TypeScript的主要目标是提供类型安全性和更好的可维护性,使得开发大型复杂应用程序更加容易。在本文中,我们将介绍入门TypeScript的基础知识。
安装TypeScript
首先,我们需要安装TypeScript。可以使用npm包管理器全局安装TypeScript:
bashCopy code
npm install -g typescript
安装完成后,可以通过输入以下命令来检查是否安装成功:
bashCopy code
tsc --version
编写第一个TypeScript程序
让我们从一个简单的“Hello, World!”程序开始。创建一个名为hello.ts的文件,然后在其中编写以下代码:
typescriptCopy code
function sayHello(name: string) {console.log(`Hello, ${name}!`);
}sayHello("TypeScript");
保存并退出文件。然后使用以下命令将其编译为JavaScript:
bashCopy code
tsc hello.ts
执行上述命令后,将生成一个名为hello.js的文件。要运行这个程序,可以在命令行中输入以下命令:
bashCopy code
node hello.js
输出应该是:
bashCopy code
Hello, TypeScript!
在上面的代码中,我们定义了一个名为sayHello的函数,它有一个参数name,类型为字符串。在函数体内,我们使用console.log打印出“Hello, ”和name的值,并使用模板字面量将它们组合在一起。最后,我们调用这个函数并将参数设置为“TypeScript”。
类型注释
TypeScript的主要特点之一是提供类型注释,可以在编译时检查类型错误。在上面的示例中,我们定义了一个name参数的类型为字符串,这是通过在函数声明中使用冒号和类型名称来实现的。
TypeScript支持多种类型注释,包括:
- 基本类型:如数字、字符串、布尔值、null、undefined、void等。
- 对象类型:如数组、元组、枚举、类等。
- 函数类型:如函数声明、函数表达式、箭头函数等。
例如,以下是一个函数声明的完整类型注释:
typescriptCopy code
function add(x: number, y: number): number {return x + y;
}
在这个示例中,我们定义了两个参数x和y,它们的类型都是数字,并且函数返回值的类型也是数字。
元组
元组是一种特殊的数组类型,它可以存储多个类型不同的值。在 TypeScript 中,我们可以使用元组来表示一组有序的值。
下面是一个简单的示例:
typescriptCopy code
let tuple: [string, number, boolean] = ["hello", 42, true];console.log(tuple[0]); // "hello"
console.log(tuple[1]); // 42
console.log(tuple[2]); // true
在这个示例中,我们定义了一个名为tuple的元组,它具有三个元素,分别是string、number和boolean类型的值。我们使用索引访问元组中的元素。
枚举
TypeScript支持枚举,它是一组具有名称的常量。下面是一个简单的示例:
typescriptCopy code
enum Color {Red,Green,Blue
}let color: Color = Color.Red;
console.log(color); // 0let colorName: string = Color[1];
console.log(colorName); // "Green"
在这个示例中,我们定义了一个名为Color的枚举,它有三个值:Red、Green和Blue,它们分别对应0、1和2。我们可以使用枚举的值来声明变量,或使用枚举的名称和值之间的映射来获取名称。
泛型
TypeScript支持泛型,它允许我们编写可重用的代码,可以适用于多种类型。下面是一个简单的示例:
typescriptCopy code
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello");
console.log(result); // "Hello"
在这个示例中,我们定义了一个名为identity的函数,它接受一个类型为T的参数,并返回同样的类型。我们使用了类型参数来指定函数应该适用于哪种类型。
接口
接口类型是一种抽象的数据类型,用于描述对象的形状和结构,可以被用作对象的类型注解,以确保对象的属性和方法符合指定的形状。
下面是一个简单的接口类型的示例:
typescriptCopy code
interface Person {name: string;age: number;
}
上述代码定义了一个名为 Person 的接口类型,它有两个属性 name 和 age,分别表示人的姓名和年龄。在 TypeScript 中,我们可以使用这个接口类型来定义一个符合该接口类型要求的对象:
typescriptCopy code
const person: Person = { name: "Tom", age: 18 };
上述代码定义了一个 person 对象,它符合 Person 接口类型的要求,因为它有 name 和 age 两个属性,分别为字符串和数字类型。
使用接口类型可以提高代码的可读性和可维护性,因为它能够明确指定对象的属性和方法的类型和结构。
类型别名
类型别名是一种给类型起别名的方式,用于提高代码的可读性和可维护性。在 TypeScript 中,我们可以使用type关键字来定义类型别名。
下面是一个简单的示例:
typescriptCopy code
type Point = {x: number;y: number;
};function distance(p1: Point, p2: Point) {const dx = p1.x - p2.x;const dy = p1.y - p2.y;return Math.sqrt(dx * dx + dy * dy);
}const p1: Point = { x: 0, y: 0 };
const p2: Point = { x: 3, y: 4 };console.log(distance(p1, p2)); // 5
在这个示例中,我们定义了一个名为Point的类型别名,它表示一个具有x和y属性的点。我们定义了一个distance函数,它接受两个Point类型的参数,并返回它们之间的距离。我们创建了两个Point对象,并计算它们之间的距离。
命名空间
TypeScript支持命名空间,它允许我们将相关的代码组织在一起,并避免名称冲突。下面是一个简单的示例:
typescriptCopy code
namespace Shapes {export class Rectangle {width: number;height: number;constructor(width: number, height: number) {this.width = width;this.height = height;}getArea() {return this.width * this.height;}}
}let rectangle = new Shapes.Rectangle(10, 20);
console.log(rectangle.getArea()); // 200
在这个示例中,我们定义了一个名为Shapes的命名空间,它包含一个名为Rectangle的类。我们使用export关键字将Rectangle类暴露出去,以便其他地方可以访问它。注意,在使用命名空间时,我们需要使用namespace关键字来定义命名空间,并使用.运算符来访问其成员。
联合类型
联合类型表示一个值可以是多种类型之一。它使用|符号将多个类型组合在一起。下面是一个简单的示例:
typescriptCopy code
function display(value: string | number) {console.log(value);
}display("Hello"); // "Hello"
display(42); // 42
在这个示例中,我们定义了一个名为display的函数,它接受一个参数,类型可以是string或number。我们可以传递一个string或number类型的值来调用该函数。
交叉类型
交叉类型表示一个值具有多个类型的属性。它使用&符号将多个类型组合在一起。下面是一个简单的示例:
typescriptCopy code
interface A {a: number;
}interface B {b: string;
}type AB = A & B;let ab: AB = {a: 42,b: "Hello"
};console.log(ab); // { a: 42, b: "Hello" }
在这个示例中,我们定义了两个接口A和B,它们分别定义了a和b属性。我们使用交叉类型A & B创建了一个新类型AB,它具有a和b属性。我们创建了一个对象ab,它具有a和b属性,并将其打印到控制台。
索引类型
索引类型允许我们使用字符串或数字类型的索引来访问对象的属性。它使用[]符号表示。下面是一个简单的示例:
typescriptCopy code
interface Person {name: string;age: number;[key: string]: any;
}let person: Person = {name: "Alice",age: 30,address: "123 Main St."
};console.log(person.address); // "123 Main St."
在这个示例中,我们定义了一个名为Person的接口,它具有name和age属性,并使用字符串类型的索引来允许其他任意属性。我们创建了一个名为person的对象,并为其添加了一个address属性。我们可以使用person.address来访问该属性的值。
类型断言
类型断言是 TypeScript 中一种强制类型转换的机制,可以使我们的代码更加灵活、精确和安全。在 TypeScript 中,我们可以使用as关键字来进行类型断言。
下面是一个简单的示例:
typescriptCopy code
const value: unknown = "hello";
const message = (value as string).toUpperCase();console.log(message); // "HELLO"
在这个示例中,我们定义了一个名为value的变量,并给它赋值一个字符串。我们使用as关键字将value断言为string类型,并调用toUpperCase方法,并把它的结果赋值给message变量。我们输出了message的值。
可选链操作符
在 JavaScript 中,如果我们访问一个对象的属性,而这个属性不存在,就会返回 undefined。例如:
javascriptCopy code
const person = { name: 'John', age: 30 }
console.log(person.job.title) // Uncaught TypeError: Cannot read property 'title' of undefined
在这个例子中,由于 person 对象中没有 job 属性,所以访问 person.job.title 时就会出现错误。
为了避免这种错误,TypeScript 3.7 引入了可选链操作符 ?.。它可以让我们在访问一个对象的属性时,避免因为属性不存在而导致的错误。例如:
typescriptCopy code
const person = { name: 'John', age: 30 }
console.log(person.job?.title) // undefinedconst job = { title: 'Software Engineer' }
person.job = job
console.log(person.job?.title) // Software Engineer
在第一次使用 person.job?.title 时,由于 person 对象中没有 job 属性,所以直接返回 undefined,不会报错。
keyof 操作符
keyof操作符用于获取一个类型的所有属性名称组成的联合类型,它可以使我们的代码更加灵活和可维护。在 TypeScript 中,我们可以使用keyof操作符来定义泛型类型和访问对象属性。
下面是一个简单的示例:
typescriptCopy code
interface Person {name: string;age: number;address: string;
}type PersonKeys = keyof Person; // "name" | "age" | "address"function getPropertyValue<T, K extends keyof T>(obj: T, key: K) {return obj[key];
}const person: Person = {name: "Tom",age: 18,address: "Beijing",
};console.log(getPropertyValue(person, "name")); // "Tom"
console.log(getPropertyValue(person, "age")); // 18
console.log(getPropertyValue(person, "address")); // "Beijing"
在这个示例中,我们定义了一个Person接口,它包含了name、age和address三个属性。我们使用keyof操作符定义了一个名为PersonKeys的类型,它是Person接口的所有属性名称组成的联合类型。我们定义了一个名为getPropertyValue的函数,它接受一个泛型类型参数T和一个名为K的属性名称参数。在函数内部,我们使用泛型类型参数和keyof操作符来访问对象的属性,并返回属性的值。
装饰器
装饰器是一种特殊的声明,可以附加到类声明、方法、属性或参数上,用来描述类的行为。它们为我们提供了一种简洁明了的方式,以声明式的方式添加或修改类的行为。
装饰器在 TypeScript 中是一个实验性的功能,需要启用experimentalDecorators编译选项。
下面是一个简单的示例:
typescriptCopy code
function log(target: any, key: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;descriptor.value = function (...args: any[]) {console.log(`Calling ${key} with args ${args}`);const result = originalMethod.apply(this, args);console.log(`Returned value: ${result}`);return result;};return descriptor;
}class Calculator {@logadd(x: number, y: number) {return x + y;}
}const calculator = new Calculator();console.log(calculator.add(2, 3)); // "Calling add with args [2, 3]", "Returned value: 5", 5
在这个示例中,我们定义了一个名为log的装饰器函数,它接受三个参数:目标类、方法名和方法描述符。我们使用装饰器修饰了Calculator类中的add方法,使其在调用时输出日志。我们创建了一个Calculator实例,并调用了add方法。
字面量类型
字面量类型是一种特殊的类型,它表示一个确定的值,可以用于增强代码的类型安全性。在 TypeScript 中,我们可以使用字面量类型来定义字符串、数字和布尔值等类型。
下面是一个简单的示例:
typescriptCopy code
type Gender = "male" | "female";interface Person {name: string;age: number;gender: Gender;
}const person: Person = { name: "Alice", age: 30, gender: "female" };console.log(person); // { name: "Alice", age: 30, gender: "female" }
在这个示例中,我们定义了一个名为Gender的字面量类型,它只允许取值"male"或"female"。我们定义了一个名为Person的接口,它具有name、age和gender三个属性,其中gender的类型为Gender。我们创建了一个Person对象,并输出它的值。
类型推断
类型推断是 TypeScript 中一种自动推断类型的机制,可以使我们的代码更加简洁、易读和可维护。在 TypeScript 中,编译器会根据上下文自动推断表达式的类型,并把它们作为类型注解。
下面是一个简单的示例:
typescriptCopy code
const message = "hello";
console.log(message.toUpperCase()); // "HELLO"
在这个示例中,我们定义了一个名为message的常量,并给它赋值一个字符串。我们调用了toUpperCase方法,并输出了它的结果。TypeScript 编译器会自动推断message的类型为string,并把它作为类型注解。
空值和未定义值
在 JavaScript 中,有两种特殊的值,分别是null和undefined。在 TypeScript 中,它们分别对应了null和undefined两种类型。
下面是一个简单的示例:
typescriptCopy code
let x: null = null;
let y: undefined = undefined;
在这个示例中,我们定义了两个变量x和y,分别赋值为null和undefined。
never 类型
never类型表示那些永远不会发生的值,它可以用于增强代码的类型安全性和可维护性。在 TypeScript 中,never类型通常用于以下两种情况:
- 当一个函数抛出异常或无限循环时,它的返回类型就是
never类型。 - 当一个函数返回类型是一个永远不会实现的类型,它的返回类型也是
never类型。
下面是一个简单的示例:
typescriptCopy code
function throwError(message: string): never {throw new Error(message);
}function infiniteLoop(): never {while (true) {}
}
在这个示例中,我们定义了两个函数,一个是throwError函数,它接受一个字符串参数message,并抛出一个错误。另一个是infiniteLoop函数,它会无限循环。这两个函数的返回类型都是never类型。
条件类型
条件类型是一种根据一个条件来选择类型的方式,它可以在 TypeScript 中实现一些高级类型操作。在 TypeScript 中,我们可以使用extends关键字和条件语句来定义条件类型。
下面是一个简单的示例:
typescriptCopy code
type IsString<T> = T extends string ? true : false;type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false
在这个示例中,我们定义了一个名为IsString的条件类型,它接受一个泛型类型参数T。如果T类型是字符串类型,则条件类型的结果为true,否则为false。我们还定义了两个变量Result1和Result2,它们分别是IsString<string>和IsString<number>类型的结果。
相关文章:
精讲typescript从入门到入土
前言 TypeScript是一种由Microsoft开发的编程语言,它是JavaScript的超集,意味着它可以编写与JavaScript完全兼容的代码,并且可以扩展其功能。TypeScript的主要目标是提供类型安全性和更好的可维护性,使得开发大型复杂应用程序更加…...
typora-beta-0.11.18版本又提示过期的解决方案
很实用,所以照搬一下下面的作者的回答,省得以后再找~~~ 知乎的作者来源如下: 作者:吴小皓 链接:typora打开报错:This beta version of Typora is expired, please download and install a newer version …...
WebUI自动化测试框架搭建(二十)-优化:测试对象无法连接或出现异常时,请更新本文作为测试对象
(二十)-测试对象无法连接或出现异常时,请更新本文作为测试对象 1 测试对象说明2 源代码下载3 学生管理系统配置安装3.1 解压打开3.2 安装依赖3.3 安装mysql数据库3.4 修改项目数据库配置3.4 安装数据库连接工具Navicat3.5 导入数据库脚本4 运行学生管理系统5 系统查看1 测试…...
【FATE联邦学习】standalone版Fateboard修改配置
背景&做法 很多其他程序(比如vscode的code server)也会使用这个 127 0 0 1:8080 socket进行通信,这样就没办法远程用vscode去开发了,所以需要修改下Fateboard的socket配置。官方文档中也给出了如何修改配置 The default data…...
分享一个应急响应web日志:access.log文件分析小工具
有时做应急响应的时候,需要提取web日志如access.log日志文件来分析系统遭受攻击的具体原因,由于开源的工具并不是很好用,所以自己用Python3写了一个简单的日志分析工具。先介绍一下access.log日志access.log日志文件记录了所有目标对Web服务器…...
windows注册服务非常实用
方式一:使用Windows自带的sc命令 1、使用管理员权限打开cmd窗口 2、注册服务命令: sc create 服务名 binpath 程序所在路径 type own start auto displayname 服务显示名称 sc create redis binpath d:\tools\redis-x64-5.0.14\redis-server.exe type …...
蓝桥dfs专题
1、dfs 路径打印 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。 按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能…...
[ 网络 ] 应用层协议——HTTPS协议原理
目录 1.HTTPS是什么 2.加密技术 2.1什么是加密 2.2为什么要加密 2.3加密处理防止被窃听 3.常见的加密方式 对称加密 非对称加密 4.数据摘要&&数据指纹 5.数字签名 6.HTTPS的工作过程探究 方案1——只是用对称加密 方案2——只进行非对称加密 方案3——双方…...
http协议如何操作
、HTTP协议(超文本传输协议) 1.1、http协议是一个基于“请求与响应”模式的、无状态的应用层协议。 http协议采用URL作为定位网络资源的标识。 1.2、URL格式 http://host[:port][path] host:合法的Internet主机域名或IP地址 port:端口号…...
ESP Insights 系列文章
ESP Insights 系列 #1 | 远程查看设备信息,快速解决固件问题 ESP Insights 是一个可远程查看设备固件运行状态和日志的平台,能够帮助开发人员快速定位并解决固件问题。 ESP Insights 系列 #2 | 新增功能 最新版本优化了用户界面、修复了系统稳定性&am…...
如何提高爬虫工作效率
单进程单线程爬取目标网站太过缓慢,这个只是针对新手来说非常友好,只适合爬取小规模项目,如果遇到大型项目就不得不考虑多线程、线程池、进程池以及协程等问题。那么我们该如何提升工作效率降低成本? 学习之前首先要对线程&#…...
React结合Drag API实现拖拽示例详解
Drag API React中的Drag API是用于实现拖放功能的API。该API由React DnD库提供,可用于实现拖放操作,例如将元素从一个位置拖动到另一个位置。 React DnD库提供了两种Drag API:基于HTML5的拖放API和自定义实现的拖放API。 基于HTML5的拖放AP…...
【华为OD机试java、python、c++、jsNode】新学校选址(100%通过+复盘思路)
代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++、jsNode四种代码。复盘思路在文章的最后 题目描述 为了解新学期学生暴涨的问题,小乐村要建立所新学校, 考虑到学生上学安全问题,需要所有学生家到学校的距离最短。 假设学校和所有学生家都走在…...
Nacos配置中心,分组配置参考,以及python、go、bash客户端连接获取
Nacos使用说明 nacos官方网站 https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 1、基本配置说明 nacosIP地址:http://xxxxx:8848/nacos/ 服务管理端登录账号:nacos XXX Java最小配置,其他客户端可参考,配置可对应到第三章…...
node-red中有关用户登录,鉴权,权限控制的流程解析
前言 默认地,node-red编辑器可以被任何访问的用户操作,包括修改节点,流数据,重新部署流。 这种默认的部署方式只适用于运行在可靠的网络中。下面我就给大家介绍一下,在公网上部署node-red后,如何对其进行安全加固和权限验证。 主要分为三部分 开启https权限保护编辑器和…...
MQTT协议-使用CONNECT报文连接阿里云
使用网络调试助手发送CONNECT报文连接阿里云 参考:https://blog.csdn.net/daniaoxp/article/details/103039296 在前面文章介绍了如何组装CONNECT报文,以及如何计算剩余长度 CONNECT报文:https://blog.csdn.net/weixin_46251230/article/d…...
每日学术速递3.8
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Unleashing Text-to-Image Diffusion Models for Visual Perception 标题:释放用于视觉感知的文本到图像扩散模型 作者:Wenliang Zhao, Yongming Rao, Zuya…...
测牛学堂:软件测试之接口测试理论基础总结
接口概念 接口:系统之间数据交互的通道。 这个系统,可以是外部和内部,也可以是两个内部系统之间的通道。 比如我们前端的登录信息,主要是用户名和密码,它通过接口传递给后端,后端校验以后,把结…...
基于土壤数据与机器学习算法的农作物推荐算法代码实现
1.摘要 近年来,机器学习方法在农业领域的应用取得巨大成功,广泛应用于科 学施肥、产量预测和经济效益预估等领域。根据土壤信息进行数据挖掘,并在此基础上提出区域性作物的种植建议,不仅可以促进农作物生长从而带来经济效益&#…...
python中html必备基础知识
<!DOCTYPE html>此标签表示这是一个html文件<heml lang"en">向搜索引擎表示该页面是html语言,并且语言为英文网站,其"lang"的意思就是“language”,语言的意思,而“en”即表示English<head>…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...
【Go语言基础【6】】字符串格式化说明
文章目录 零、格式化常用场景一、Go 字符串格式化核心概念二、常用格式化占位符1. 整数类型2. 浮点数类型3. 字符串与布尔类型4. 指针与通用类型 三、宽度与精度控制1. 宽度控制2. 精度控制(浮点数/字符串) 零、格式化常用场景 数值转字符串:…...
