两小时快速入门 TypeScript 基础(一)工作流、基本类型、高级类型

news2024/9/28 23:34:40

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js 等)
📃个人状态: 2023届本科毕业生,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力 n 年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

TypeScript入门

内容参考链接
TypeScript(零) —— 简介、环境搭建、第一个实例搭建开发环境

文章目录

  • TypeScript入门
    • 认识 TypeScript
    • TypeScript 工作流
    • TypeScript 的类型
      • Number 数字类型
      • String 字符串类型
      • Boolean 布尔类型
      • Array 数组类型
      • Tuple 元组类型
      • Union 联合类型
      • Literal 字面量类型
      • Enum 枚举类型
      • Any 任意类型
      • unknown 未知类型
      • void、undefined、never 类型
      • Type Assertions 类型适配
    • 本章小结


认识 TypeScript

TypeScript 简介

TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。

TypeScript 的作用

我们都知道,JavaScript 是弱类型的语言,对于一些类型的限制并不是很明确。比如说我们编码一个在两个输入框中输入数字求和的加法小程序,这时候直接输入到文本框的数字会被自动转换为字符串形式,就会得到 1 + 1 = 11 的奇怪结果。那么这个时候 TypeScript 就可以大显身手,实现 1 + 1 = 2。

a. 规范我们的代码
b. 代码编译阶段就能及时发现问题
c. 在原生JS基础上加上了一层类型定义

TypeScript 工作流

TSC (把 ts 文件转换为 js 文件)的作用相当于 Babel(把高级语法和代码转换为浏览器能识别的低级语法和代码)。

编译和运行参考 TypeScript(零) —— 简介、环境搭建、第一个实例

在这里插入图片描述

上图表示:ts 文件通过 tsc 命令把 ts 文件转成了 js 文件。

TypeScript 的类型

相比于 JavaScript 的原始类型(基本数据类型)和对象类型(引用数据类型),TypeScript 也有自己的数据类型,内容如下:

基本类型:boolean、string、number、array、tuple、enum、null、undefined、object、void、never、any

高级类型:union 组合类型、Nullable 可空类型、Literal 预定义类型

接下来,我们对不同类型进行逐一详细的探索…

Number 数字类型

对数字的定义只有一个笼统的 Number 表示,既能表示 整数、也能表示 浮点数,甚至也可以表示 正负数。例如:1,3.3,-5 等等。

let num1 = 2
let num2 = 6
function add(n1: number, n2: number) {
    return n1 + n2
}
console.log(add(num1, num2))

之后终端执行 tsc main.tsnode main.js,可以得出结果 8

String 字符串类型

与 JavaScript 书写方式及使用方法均一致。

'前端杂货铺'
"前端杂货铺"
`前端杂货铺`
let myName: string = "前端杂货铺"
console.log('myName', myName)

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

Boolean 布尔类型

表示真、假,常用于处理判断逻辑。

let isTrue: boolean = true
console.log('isTure', isTrue)

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

Array 数组类型

数组中可以存放任意类型的数据,JS中数组的宽容度非常大,TS也继承了这一点。

以下三种写法(list1、list2、list3)表示的完全一致,鼠标移动至 list 上编译器均提示 number[],表示数字类型。

在这里插入图片描述

let list1: number[] = [1, 2, 3, 4]
let list2: Array<number> = [1, 2, 3, 4]
let list3 = [1, 2, 3, 4]

下面的 list 4 为 (string | number)[],表示字符串和数字类型。

在这里插入图片描述

let list4 = [1, '前端杂货铺']

下面的 list 5 为 any[],表示任意类型。

在这里插入图片描述

let list5: any[] = [1, '前端杂货铺', true]

Tuple 元组类型

固定长度,固定类型的 Array,声明元组的时候一定要事先指定类型。

let person: [number, string] = [1, "前端杂货铺"]

此时,元组的长度和类型都被固定住了,当我们尝试修改元素的长度和类型都会报错。

在这里插入图片描述

注:元组类型有一个 Bug,可以调用 push() 方法改变元组的长度。

Union 联合类型

联合类型表示一个变量同时支持两个或者多个不同的类型。

let union : string | number

在这里插入图片描述

Literal 字面量类型

可以混合使用不同的类型。

let literal : 1 | "前端杂货铺" | true | [1, 2, 3]

示例:merge 求和(分为数字和字符串两种方式)

function merge(n1: number | string, n2: number | string, resultType: "as-number" | "as-string") {
    if (resultType === 'as-string') {
        return n1.toString() + n2.toString()
    }
    if (typeof n1 === "string" || typeof n2 === "string") {
        return n1.toString() + n2.toString()
    } else {
        return n1 + n2
    }
}

let mergeNumber1 = merge(1, 1, "as-number")
let mergeNumber2 = merge(1, 1, "as-string")
let mergeString = merge("前端", "杂货铺", "as-string")

console.log(mergeNumber1)
console.log(mergeNumber2)
console.log(mergeString)

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

Enum 枚举类型

枚举允许我们定义一组命名的常量。默认情况下,我们获取到对象的某个属性打印出来的是该属性的索引,神奇的是,我们可以 给对象里面的属性赋值,这时候再获取到对象的某个属性时打印出来的就是 我们给属性赋的值 了。

enum Color {
    red,
    yellow = '黄色',
    blue = 'blue'
}
let color1 = Color.red
console.log(color1)
let color2 = Color.blue
console.log(color2)
let color3 = Color.yellow
console.log(color3)

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

Any 任意类型

Any 这个类型可以让我们随意定义类型,当我们“懒得”定义复杂类型结构的时候,可以合理的使用它。

let randomValue: any = 123
randomValue = true
randomValue = "前端杂货铺"
randomValue = {}

unknown 未知类型

unknown 不保证类型,但 可以保证类型安全,当我们出现错误编码时(下面的数字 123 不能调用 toUpperCase() 方法),使用 unknow 编译器会有报错提示。

在这里插入图片描述

我们可以做出以下适配,让编译器不报错。

let randomValue: unknown = 123
randomValue = true
randomValue = "前端杂货铺"
randomValue = {}
if (typeof randomValue === 'function') {
    randomValue()
}
if (typeof randomValue === 'string') {
    randomValue.toUpperCase()
}

void、undefined、never 类型

不存在时用 void,undefined 表示必须存在但可以不赋值,永远不会执行完时用 never。

此时使用了 void(默认就是 void,可加可不加),不添加返回值也一切正常。

function printResult() : void {
    console.log("前端杂货铺")
}
console.log("Hello", printResult())

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

此时使用了 undefined,函数体里面必须有返回值,我们可以在函数体内添加 return,不然会报错。

function printResult() : undefined {
    console.log("前端杂货铺")
    return
}
console.log("Hello", printResult())

之后终端执行 tsc main.tsnode main.js,可以得出以下结果。

在这里插入图片描述

此时使用了 never,一般用在抛出异常或者 promise 中。

function throwError(message: string, errorCode: number): never {
    throw {
        message,
        errorCode
    }
}
throwError("not found", 404)
function whileLoop(): never {
    while(true) {
        console.log("前端杂货铺")
    }
}

Type Assertions 类型适配

第一个 endsWith() 出现的地方编译器是不会自动提示补全的,因为此时的类型还是 any,而不是 string,我们可以使用 endsWith() 在下面代码中第二次和第三次出现的地方的方式进行类型适配,便可以实现自动补全(在我们刚开始不明确类型,而后面明确类型后就可以使用这种类型适配的方式)

let message : any
message = "前端杂货铺"
message.endsWith("铺")

(<string>message).endsWith("铺")
(message as string).endsWith("铺")

本章小结

存在即合理,TypeScript 的出现自有它的用途。TypeScript 作为 JavaScript 的超集,对 JavaScript 进行了一些列约束,使得弱类型的 JavaScript 变成强类型,这就会使得代码更清晰、可读性更高、提高了代码的可读性和可维护性,更适合开发大型应用。

结合 Vue3 对 TypeScript 更好的包容性,使用 Vue3 + TS 构建大、中、小型应用便成了一种大趋势…


参考资料:

  1. TypeScript 百度百科
  2. TypeScript 入门讲解 【作者:阿莱克斯刘】

在这里插入图片描述


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

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

相关文章

vscode实现本地代码自动同步到远程机器

在用vscode编码时经常会遇到代码在本地&#xff0c;实际代码编译运行在远端的服务器上&#xff0c;如果在本地修改了代码还需要用比较工具同步到远程服务器上&#xff0c;这样的开发模式非常费时费力&#xff0c;有时候还会漏代码&#xff0c;给开发带来了隐患。 以上的不变可以…

大类资产轮动策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Roop:显卡GPU版软件已就位,速度提升28倍!

我在本地的一台电脑行做了个简单的对比&#xff0c;同一个小视频&#xff0c;CPU要5分多钟&#xff0c;GPU只要12秒。而且&#xff0c;内存的需求量也大幅度降低了。 美队这个架子&#xff0c;给托尼用&#xff0c;也挺不错哦&#xff01; 这次的版本&#xff0c;准确来说是GPU…

小程序中实现二维数组的展示

目录 1 定义变量2 外层循环3 内层循环总结 我们在小程序中有一类需求就是要显示二维数组&#xff0c;二维数组是指数组中的元素也是数组&#xff0c;比如我们以菜谱为例&#xff0c;菜谱有名称和用料&#xff0c;用料就又是一个数组&#xff0c;如果我们构造数据可以是这样 [ {…

纯干货:怎么样去满足客户需求,增强用户粘性?

无论是销售产品还是提供服务&#xff0c;最终目标是为客户提供他们想要和需要的东西。但随着竞争的加剧和客户期望的变化&#xff0c;了解这些需求变得越来越复杂。因此我们需要识别和满足他们可以产生重大影响的地方。 识别和了解客户需求的好处 想象一下&#xff0c;你在家乡…

详解volatile关键字、线程的可见性、有序性

0、引言 在juc多线程并发编程中&#xff0c;常常需要关注线程的“可见性”与“有序性”。本文将详细介绍这两部分内容&#xff0c;以及volatile关键字的使用。 阅读本文前需要一些jvm运行时内存、进程与线程、共享内存、锁等相关知识。 1、可见性 1.1 定义 定义&…

DOTA-Acrylamide,DOTA-DBCO,DOTA-MeTz,三者DOTA双功能螯合剂信息说明总结

今天小编分享DOTA螯合剂试剂&#xff1a;它们分别是DOTA-Acrylamide&#xff0c;DOTA-DBCO&#xff0c;DOTA-MeTz&#xff0c;今天整体分享一下相关的知识&#xff0c;一起看看吧。 &#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09; 一、D…

【css】动画:行走的人

素材&#xff1a; 链接&#xff1a; https://img1.baidu.com/it/u3361754298,960828090&fm253&fmtauto&app138&fPNG?w1472&h325 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

熊哥保佑你 数据结构复习

构造哈夫曼树&#xff1a; 先带权值最小的&#xff0c;再找有关系的&#xff08;一般是相等或相近&#xff09;&#xff0c;没关系的放一边&#xff0c;最后将有关系的和没关系的组成一个哈夫曼树。 . 最小生成树&#xff1a; 顶点数&#xff1a;n 边数&#xff1a;n-1 kru…

AI绘画:切换黑色风格,安装更棒的主题!

从Stable Diffusion 出现的第一天起&#xff0c;我就开始关注这个项目&#xff0c;后来也出过几期教程。 一直以来都是只追求功能实现&#xff0c;不管界面的问题。现在我突然想要换一个帅气的主题了…就是这么突然&#xff01; 默认的白色主题太….普通…既没有设计感啊&…

蓝桥杯专题-试题版-【FJ的字符串】【Huffuman树】【Sine之舞】【报时助手】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

代谢组学及网络药理学研究技术与实践

一、背景: 代谢组学是近年发展快速的一门学科&#xff0c;目前在医学、植物学、微生物学、毒理学、药物研发等多个领域中得到了广泛的应用。如何从复杂的代谢组学数据中提取出有价值的信息&#xff0c;筛选出潜在的生物标志物成为近年来代谢组学研究的热点和难点。网络药理学能…

supervisor-eventlistener

了解supervisor-eventlistener 本文主要介绍 supervisor Event 的功能。 supervisor 作为一个进程管理工具&#xff0c;在 3.0 版本之后&#xff0c;新增了 Event 的高级特性, 主要用于做(进程启动、退出、失败等)事件告警服务。 Event 特性是将监听的服务(listener)注册到su…

Axure教程—中继器筛查与排序

当工作中需要进行数据筛查排序操作时&#xff0c;我们可以如何使用Axure来进行相关操作呢&#xff1f;本篇文章里&#xff0c;作者利用中继器为我们展示了数据筛查与排序&#xff0c;让我们一起来看一下。 预览效果 预览地址&#xff1a;https://6q6ajh.axshare.com 功能介绍…

【AI模型部署】基于gradio和python的网页交互界面(web-ui)——简易使用方法

使用gradio&#xff0c;只需在原有的代码中增加几行,快速部署机器学习模型&#xff0c;就能自动化生成交互式web页面&#xff0c;并支持多种输入输出格式&#xff0c;比如图像分类中的图>>标签&#xff0c;超分辨率中的图>>图等。 同时还支持生成能外部网络访问的链…

最小二乘法的原理及实现

1.最小二乘法的原理及实现 笔记来源于《白话机器学习的数学》 1.1 最小二乘法的原理 预测一个变量 x x x与一个变量 y y y的关系 例如&#xff1a;广告费 x x x与点击量 y y y 用直线拟合数据 1.2 最小二乘法的实现 广告费x和点击量y&#xff0c;找到一条直线表达式&#x…

基于matlab多运动目标跟踪监测算法实现(附源码)

一、前言 此示例演示如何对来自固定摄像机的视频中的移动对象执行自动检测和基于运动的跟踪。 二、介绍 移动物体检测和基于运动的跟踪是许多计算机视觉应用的重要组成部分&#xff0c;包括活动识别、交通监控和汽车安全。基于运动的对象跟踪问题可以分为两部分&#xff1a; 检…

【KitBash3D Cargo插件】向UE中直接导入免费模型

步骤 1. 进入KitBash3D官网&#xff0c;点击右上角按钮来下载Cargo 2. 下载好后是个压缩包&#xff0c;需要进行解压 3. 解压后运行安装程序 4. 我就安装到默认的安装路径 5. 安装好后打开软件&#xff0c;注册账号&#xff08;如果点击创建账户按钮没反应就去KitBash3D官网注…

VS依赖注入(DI)构造函数自动生成局部私有变量

前言 依赖注入(DI)在开发中既是常见的也是必需的技术。它帮助我们优化了代码结构&#xff0c;使得应用更加灵活、易于扩展&#xff0c;同时也降低了各个模块之间的耦合度&#xff0c;更容易进行单元测试&#xff0c;提高了编码效率和质量。我们经常会先定义局部变量&#xff0…

OpenCL编程指南-6.2程序对象

创建和构建程序 要创建程序对象&#xff0c;可以传入OpenCL C源代码文本&#xff0c;或者利用程序二进制码来创建。由OpenCL C源代码创建程序对象是开发人员创建程序对象的一般做法。OpenCL C程序的源代码放在一个外部文件中&#xff08;例如&#xff0c;就像我们的示例代码中…