这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
初识TypeScript
什么是TypeScript?
对于初学TypeScript的同学,一定很困惑TypeScript是什么?只闻其名,不识其意。我学它又有什么用呢? 网上搜索TypeScript,大多会得到这样的答案:
TypeScript 是 JavaScript 的一个超集
TypeScript是一种开源的编程语言,该语言项目由微软进行维护和管理,它的开发者安德斯·海尔斯伯格(Anders Hejlsberg)同时还是C#和Delphi的首席架构师(太强了)。
TypeScript相对于JavaScript增加了很多的语言特性,因此原本的JavaScript不用做任何修改,最后TypeScript代码还是要编译成JavaScript运行。
一句话总结:
JavaScript开发大型项目的时候不好用,我们用更严谨的TypeScript敲代码!
为什么要用TypeScript?
那么问题来了,为什么会不好用呢?有一个经典的例子可以参考:
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有很多的坏处。
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的类型层次如图所示,下层类型的值可以赋值给上层类型的变量或常量。其中unknown是Top Type(全集),Never是Bottom Type(空集),因此不存在Never类型的变量,即使 any也不可以赋值给never。
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。
交叉类型
交叉类型是将多个类型合并为一个类型。就像数学里的A ∩ B。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。 例如, number & string同时是 number 和 string。
类型拓宽、收窄
当我们创建一个变量但不标记类型时,类型检查器需要根据可能的值确定一个类型,用let、var声明变量时,TS认为变量未来会发生改变,所以将类型推断为相对宽泛的类型。
在某些情况下,TS可以更加确定变量的类型,此时它将会将变量类型收窄。比如用const声明常量时,TS知道常量不变,会将类型推断为最窄的字面量类型。
结语
时间有限,探索无限。TypeScript刚刚入门,文章中只记录了最基础的一部分内容,TS还有大量的知识等待我去学习,在上课的过程中可以体会到TypeScript内容还是非常多的,熟练运用TypeScript也需要大量的实践经验,在编辑这篇笔记的时候我也学到了很多。您的点赞
也是我持续更新学习的动力。留下几个链接,往后深入理解了再记录于此,加油。