概述
简单了解TypeScript的基本信息:
- 开发商:微软
- 设计者:编程语言设计大师 Anders Hejlsberg,他也是 C# 和 .NET 的设计师
- 本质:一种基于JavaScript语言的强类型编程语言
- 目的:增强JavaScript的功能,使其更适合多人合作的企业级项目
- 历史重大版本:
2013年,微软的 Visual Studio 2013 开始内置支持 TypeScript 语言。
2014年,TypeScript 1.0 版本发布。同年,代码仓库搬到了 GitHub。
2016年,TypeScript 2.0 版本发布,引入了很多重大的语法功能。
2018年,TypeScript 3.0 版本发布。
2020年,TypeScript 4.0 版本发布。
2023年,TypeScript 5.0 版本发布。
学习前置建议
学习TypeScript,你需要先了解并掌握大部分JavaScript的语法。因为在TS中大部分真正实际的功能都是依赖JavaScript引擎完成,TypeScript只是添加了一个类型系统。
本文章假定你已经了解JavaScript语言并掌握其语法,只介绍TypeScript引入的新语法,主要是类型系统。
什么是计算机语言类型(type)
计算机语言类型:是一组具有相同特征的值,即人为添加的一种约束编程和用法提示。 如果两个值具有某种共同的特征,就可以说,它们属于同一种类型。其主要目的是在软件开发过程中,为编译器和开发工具提供更多的验证和帮助,帮助提高代码质量,减少错误。
举例:比如321
和789
,这两个值都能进行数值运算,进行数值运算是他们相同的特征,那么我们可以说他们是同类型的值,一般在计算机语言中,我们将其定义为数值类型(number)。
当某个值被确定为某类型时,这个值就应当具有该类型的所有特征,可以进行该类型的所有运算方法。在强类型语言中,凡是适用该类型的地方,都可以使用这个值;凡是不适用该类型的地方,使用这个值都会报错。比如在TS当中
let n:number; // 定义number类型变量 n
n = '99'; // 报错 不能将类型“string”分配给类型“number”。ts(2322)
n = 120; // 正常
JavaScript语言没有这个功能,不会检查类型。
作为比较,TypeScript 是在开发阶段报错,这样有利于提早发现错误,避免使用时报错。另一方面,函数定义里面加入类型,具有提示作用,可以告诉开发者这个函数怎么用。
计算机语言类型分类
动态类型、静态类型和强类型、弱类型
在JavaScript中,有一道前几年老生常谈的面试题,JS有哪些数据类型? 我们知道JS语言本身有一套类型系统,但它的类型系统很独特,并不像我们在学校学习的C、Java等语言,JavaScript的类型系统非常弱,而且没有使用限制,运算符可以接受各种类型的值。
在JavaScript中你会发现let n = 100; n = 'hello';
是可以正常运行的,在运行时JS会做类型检查,但仍然通过运行,我们把这种变量类型可变(即可忽略)的类型系统称语言之为弱定义类型语言(即弱类型语言),其不具有很强的约束性,并且把这种运行期间才做数据类型检查的语言,称之为动态类型语言。
所以综上所述,JavaScript即是弱类型语言,又是动态类型语言。
而在TypeScript中,由于其引入了更强大、更严格的类型系统,上述JS案例在TS编译过程中便会报错Type 'string' is not assignable to type 'number'.
。原因是变量赋值时,TypeScript已经推断确定了类型,后面就不允许再赋值为其他类型的值,即变量的类型是静态的。
我们把编译期间做数据类型检查的语言称之为静态类型语言,并且如果该语言变量类型一旦被指定,不通过强制类型转换手段进行变更变量类型时,该变量类型固定的语言称之为强定义类型语言(即强类型语言)。
由上所述我们发现,TypeScript是静态类型语言,那么TypeScript是不是强类型语言?个人观点,由于TypeScript始于JavaScript,且终于JavaScript,即TypeScript的运行要先通过tsc编译成JavaScript语法,所以TypeScript并不存在运行时,且其只在编译时报错,但只要符合JS与法标准的,即便变量类型被改变,并不会中断编译,仍然输出标准JS结果。所以如果只讲TS,我认为他是强类型,如果讲依赖JS,TS只是提前了类型检查的时机,我认为其为弱类型。
此观点仁者见仁,智者见智,类型的强弱是渐变量,没有黑白分明的定界,同一个语言有些地方类型约束强,有些地方弱,所以讨论强弱没什么意义。。
各种类型语言的优缺点
动态类型语言
优点:方便阅读,不需要写非常多的类型相关的代码;
缺点:不方便调试,命名不规范时会造成读不懂,不利于理解等;
静态类型语言
优点:结构非常规范,便于调试,方便类型安全,有利于代码的静态分析,发现错误,更好的 IDE 支持,做到语法提示和自动补全,有助于代码重构;
缺点:需要写更多类型相关代码,不清晰明了,丧失了动态类型的代码灵活性,增加了编程工作量,更高的学习成本,需要独立的编译工作,以及一些兼容性问题;
强类型语言和弱类型语言
强类型定义语言在速度上可能略逊色于弱类型定义语言;强类型定义语言带来的严谨性能够有效的避免许多错误;
小结
TypeScript有助于提高代码质量,保证代码安全,更适合用在大型的企业级项目。这就是为什么大量JavaScript项目转成TypeScript的原因。但这些引入静态类型的缺点使得 TypeScript不一定适合那些小型的、短期的个人项目。