【青训营】- TypeScript入门笔记

350 阅读5分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

初识TypeScript

什么是TypeScript?

对于初学TypeScript的同学,一定很困惑TypeScript是什么?只闻其名,不识其意。我学它又有什么用呢? 网上搜索TypeScript,大多会得到这样的答案:

TypeScript 是 JavaScript 的一个超集

image.png

TypeScript是一种开源的编程语言,该语言项目由微软进行维护和管理,它的开发者安德斯·海尔斯伯格Anders Hejlsberg)同时还是C#和Delphi的首席架构师(太强了)。

TypeScript相对于JavaScript增加了很多的语言特性,因此原本的JavaScript不用做任何修改,最后TypeScript代码还是要编译成JavaScript运行。

一句话总结:

JavaScript开发大型项目的时候不好用,我们用更严谨的TypeScript敲代码!

为什么要用TypeScript?

那么问题来了,为什么会不好用呢?有一个经典的例子可以参考:

image.png

image.png

const input1 = document.getElementById("num1")
const input2 = document.getElementById("num2")
const button = document.querySelector("button")
function add(num1, num2) {
    return num1 + num2
}
button.addEventListener("click", function () {
    console.log(add(input1.value, input2.value));
})

在网页中我们写一个两数相加求和的功能,我们输入1+2时,希望输出的答案应该是3,然而控制台输出的答案却是12。 当然我们都知道这里输入框得到的是字符串,JS在相加时会拼接字符串,我们可以在程序里转化将字符串转化成number类型,从而实现正常的求和功能。然而在开发大型项目时,总是会遇到各种各样的类型错误,我们在编程时也许一不小心就跳到坑里去了,而在程序中调试这些问题又要花上大量时间。

因此大佬们就引入了TypeScript,TypeScript最大的优势就在于他引入了类型(Type)的概念,这也是TypeScript命名的原因。同样的代码放入TypeScript文件中,当我们把鼠标移到num1上时,TypeScript会提示我们这是一个any类型的变量,后面会提到any有很多的坏处。

image.png

TypeScript基础知识

初始化开发环境

首先安装Node.js和VsCode。

初始化第一个TS项目,在终端命令行中输入:

npm init -y  // 生成package.json
npm install --save-dev typescript // 安装稳定版
npm install --save-dev typescript@next // 安装最新版

使用tsc命令编译TypeScript代码,会生成一个对应名字的JS文件。

tsc add.ts

如果有问题,TypeScript会在编译的时候直接抛出错误,但同时JS文件不受影响还是会生成,TS类型检查和生成JS是两个独立的过程。

为了方便,还可以直接使用线上平台playground练习typescript。

数据类型

我们可以在变量后面中使用一个冒号:+类型名来告诉TypeScript这是一个什么样的类型。比如 num1: number就表示num1是number类型。

function add(num1: number, num2: number) {
    return num1 + num2
}

TypeScript中支持自定义类型,也有一些基本数据类型

数据类型关键字
任意类型any
数字类型number
字符串类型string
布尔类型boolean
数组类型Array
元组Tuple
枚举enum

除此之外还有null、undefined、void、never

TypeScript的类型层次如图所示,下层类型的值可以赋值给上层类型的变量或常量。其中unknownTop Type(全集),NeverBottom Type(空集),因此不存在Never类型的变量,即使 any也不可以赋值给never

image.png

any类型比较飘逸,即是Top Type又是Bottom Type,any类型有很多缺点:

any可以和其他类型变量互相赋值,不安全,应该避免使用。
any具有传染性,它会让接触到的变量变得不安全(type unsafe)
any会隐藏bug,因为TypeScript不知道你的类型,所以不会报错
any会隐藏代码设计细节,丢失了对数据类型的设计

我们可以在tsconfig中打开严格模式禁用隐式any

"strict": true,
"noImplicitAny": true

类型与集合

类型集合有点像数学里数据集合的概念,有空集、单元素集合、有限集合、无限集合等等。

联合类型

联合类型表示一个值可以是几种类型之一。就像数学里的A∪B。我们用竖线( |)分隔每个类型,所以 number | string表示一个值可以是 number或 string

image.png

交叉类型

交叉类型是将多个类型合并为一个类型。就像数学里的A ∩ B。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。 例如, number & string同时是 number 和 string

image.png

类型拓宽、收窄

当我们创建一个变量但不标记类型时,类型检查器需要根据可能的值确定一个类型,用let、var声明变量时,TS认为变量未来会发生改变,所以将类型推断为相对宽泛的类型。

在某些情况下,TS可以更加确定变量的类型,此时它将会将变量类型收窄。比如用const声明常量时,TS知道常量不变,会将类型推断为最窄的字面量类型。

结语

时间有限,探索无限。TypeScript刚刚入门,文章中只记录了最基础的一部分内容,TS还有大量的知识等待我去学习,在上课的过程中可以体会到TypeScript内容还是非常多的,熟练运用TypeScript也需要大量的实践经验,在编辑这篇笔记的时候我也学到了很多。您的点赞33ZP(L0_BU5T9%IEMWO_`OE.png 也是我持续更新学习的动力。留下几个链接,往后深入理解了再记录于此,加油。

NXZ7@O2I``N[_N0]TXZ80J3.png

TypeScript官方文档

TypeScript中文文档

youtube学习课程