typescript
TypeScript,是由微软进行开发和维护的一种开源的编程语言。TypeScript是JavaScript的严格语法超集,提供了可选的静态类型检查。当前最新版本为TypeScript 5.8。
2012年10月1日,TypeScript首次公开亮相,由Anders Hejlsberg主导开发。2013年6月19日,微软正式发布TypeScript 0.9。2014年4月3日,TypeScript 1.0正式版发布。2016年9月22日,TypeScript 2.0正式发布。2018年7月31日,微软宣布推出TypeScript 3.0正式版。2023年3月27日,微软发布了TypeScript 5.0版本。2025年3月11日,微软官方宣布会彻底提高TypeScript的性能。
发展背景与历史
发展背景
微软意识到ECMAScript未来将会被应用到无数场景,而且他们公司内部团队在处理复杂的JavaScript代码库时面临着巨大的挑战,所以他们觉得有必要创造强大的工具来帮助编写JavaScript——尤其是针对大型JavaScript项目。基于此需求,TypeScript也确定了自己的定位和特性,它是JavaScript的超集,将类型检查和静态分析、显式接口和最佳实践结合到单一语言和编译器中。通过在JavaScript上构建,TypeScript能够更接近目标运行时,同时仅添加支持大型应用程序和大型团队所需的语法糖。
发展历史
2012年10月1日,TypeScript首次公开亮相,由Anders Hejlsberg主导开发。它是ECMAScript的类型化超集,可被编译成常用的JavaScript。TypeScript还可以通过启用丰富的工具体验来极大地帮助提升生产力,与此同时开发者保持不变维护现有的代码,并继续使用喜爱的JavaScript库。
2013年6月19日,微软正式发布TypeScript 0.9。TypeScript 0.9的发布带来了一些新的功能,包括语言功能的扩展,Visual Studio中工具的改进,新的语言服务让交互性能获得更加显著。
2014年4月3日,TypeScript 1.0正式版发布。TypeScript 1.0考虑到大规模的ECMAScript应用程序的开发;提供一个稳定的平台给用户构建应用;同时创建和分享文件类型定义文件,兼容未来的TypeScript版本。
2016年9月22日,TypeScript 2.0正式发布。此次更新带来了多项提升开发效率的新特性,进一步向ECMAScript(ES)标准演进看齐,全面增强对JavaScript生态库与工具链的支持,并通过升级语言服务(Language Service)为各类开发工具提供更优质的代码编辑体验。
2018年7月31日,微软宣布推出TypeScript 3.0正式版。TypeScript 3.0引入了一种新的灵活且可扩展的方式来构建项目、提供对参数列表进行操作新的强大支持能力、强制显式检查的新类型、更好的JSX支持、整体更好的错误处理等。
2020年8月,微软TypeScript 4.0正式版发布,该版本没有重大的突破性变化。
2023年3月27日,微软发布了TypeScript 5.0版本。TypeScript 5.0引入了新的decorators标准,添加新功能从而在Node及其捆绑项中更好地支持ESM项目,为库所有者提供了掌控泛型推理(generic inference)的新方法,扩展了JSDoc功能,简化了配置,并进行了许多其他改进。
2025年3月1日,微软宣布推出全新的TypeScript 5.8,这是一种基于ECMAScript的编程语言。用户可以通过NuGet获取,也可以使用NPM命令(npm install -D typescript)来进行安装。3月11日,微软官方开发者博客发文,宣布将彻底提高TypeScript的性能。为了实现性能提速目标,微软已经开始着手进行TypeScript编译器和工具的本地化移植。本地化实现将大幅提高编辑器启动速度,将大多数构建时间缩短10倍,并显著降低内存使用。
产品概况
TypeScript是由微软进行开发和维护的一种开源的编程语言。
ECMAScript的超集
TypeScript在JavaScript基础上扩展了语法体系,通过与编辑器的深度集成(如智能提示、类型检查),在编码阶段即时捕获错误,提升开发效率。
可信赖的编译结果
TypeScript代码会转换为纯JavaScript,可在所有支持JavaScript的环境中运行:浏览器、node.js、Deno、Bun,以及各类应用场景。
大规模应用的安全保障
TypeScript完全兼容ECMAScript,并通过类型推断(无需手动标注所有类型)提供强大的工具链支持,助力复杂项目维护。
产品特性
系统类型
从TypeScript的名字就可以看出来,「类型」是其最核心的特性。
类型系统按照「类型检查的时机」来分类,可以分为动态类型和静态类型。
动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。JavaScript是一门解释型语言,没有编译阶段,所以它是动态类型。
静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。TypeScript在运行前需要先编译为ECMAScript,而在编译阶段就会进行类型检查,所以TypeScript是静态类型。
类型系统按照「是否允许隐式类型转换」来分类,可以分为强类型和弱类型。
TypeScript是完全兼容JavaScript的,它不会修改JavaScript运行时的特性,所以它们都是弱类型。
适用于任何规模
TypeScript非常适用于大型项目——这是显而易见的,类型系统可以为大型项目带来更高的可维护性,以及更少的bug。
在中小型项目中推行TypeScript的最大障碍就是认为使用TypeScript需要写额外的代码,降低开发效率。但事实上,由于有[类型推论][],大部分类型都不需要手动声明了。相反,TypeScript增强了编辑器(IDE)的功能,包括代码补全、接口提示、跳转到定义、代码重构等,这在很大程度上提高了开发效率。而且TypeScript有近百个[编译选项][],如果你认为类型检查过于严格,那么可以通过修改编译选项来降低类型检查的标准。
TypeScript还可以和ECMAScript共存。这意味着如果你有一个使用JavaScript开发的旧项目,又想使用TypeScript的特性,那么你不需要急着把整个项目都迁移到TypeScript,可以使用TypeScript编写新文件,然后在后续更迭中逐步迁移旧文件。如果一些JavaScript文件的迁移成本太高,TypeScript也提供了一个方案,可以在不修改JavaScript文件的前提下,编写一个[类型声明文件][],实现旧项目的渐进式迁移。
由此可见,TypeScript的发展已经深入到前端社区的方方面面了,任何规模的项目都或多或少得到了TypeScript的支持。
与标准同步发展
TypeScript的另一个重要的特性就是坚持与ECMAScript标准同步发展。
ECMAScript是JavaScript核心语法的标准,自2015年起,每年都会发布一个新版本,包含一些新的语法。一个新的语法从提案到变成正式标准,需要经历以下几个阶段:
Stage 0:展示阶段,仅仅是提出了讨论、想法,尚未正式提案。
Stage 1:征求意见阶段,提供抽象的API描述,讨论可行性,关键算法等。
Stage 2:草案阶段,使用正式的规范语言精确描述其语法和语义。
Stage 3:候选人阶段,语法的设计工作已完成,需要浏览器、node.js等环境支持,搜集用户的反馈。
Stage 4:定案阶段,已准备好将其添加到正式的ECMAScript标准中。
一个语法进入到Stage 3阶段后,TypeScript就会实现它。一方面,可以尽早的使用到最新的语法,帮助它进入到下一个阶段;另一方面,处于Stage 3阶段的语法已经比较稳定了,基本不会有语法的变更,可以能够放心的使用它。除了实现ECMAScrip标准之外,TypeScript团队也推进了诸多语法提案,比如可选链操作符(?.)、空值合并操作符(??)、Throw表达式、正则匹配索引等。
基础类型
1.布尔值(boolean)
boolean是最基本的数据类型,对应true和false值。
2.数字(number)
和ECMAScript一样,TypeScript里所有的数字都是浮点数。这些浮点数的类型是number。除了支持十进制和十六进制值,TypeScript还支持ECMAScript2015引入的二进制和八进制值。
3.字符串(string)
TypeScript使用string表示文本数据类型,与JavaScript相同,可以使用双引号(")或单引号(')表示字符串。还可以使用模版字符串定义多行文本和内嵌表达式。这种字符串被反引号(`)包围,并且以的形式嵌入表达式。
4.数组(Array)
定义数组的方式有两种。第一种是在元素类型后面接[],表示由此类型元素组成的一个数组。第二种方式是使用数组泛型,Array<元素类型>。
5.元组(Tuple)
元组类型表示一个已知元素数量和类型的数组,各元素的类型不必相同。比如,可以定义一对值分别为string和number类型的元组。
6.枚举(enum)
enum类型是对ECMAScript标准数据类型的一个补充。默认情况下,从0开始为元素编号,也可手动指定成员数值。
7.any类型
想为那些在编程阶段还不清楚类型的变量指定一个类型。这些变量的值可能来自动态的内容,比如用户输入或第三方代码库。在这种情况下,不希望类型检查器对这些值进行检查,那么就可以使用any类型标记这些变量。
8.void类型
从某种程度上讲,void类型与any类型相反,表示没有任何类型。当一个函数没有返回值时,可将其返回类型指定为void。声明一个void类型的变量用途有限,因只能赋予undefined或null。
9.null和undefined类型
默认下,null和undefined是所有类型的子类型,可赋值给number类型变量。若编译选项指定--strictNullChecks,则它们只能赋值给void或自身。
10.never类型
never类型表示永不出现的值的类型。返回never的函数需有无法达到的终点。
11.object类型
object表示非原始类型(即除number、string、boolean、symbol、null和undefined之外的类型)。
12.类型断言
类型断言是一个非常有用的功能。从服务器端接收到一个对象,开发者知道它是什么类型,但是编译器不知道,这时候就可以使用类型断言将对象的类型告诉编译器,避免编译器报错。类型断言有两种形式,一种是尖括号语法,另一种是as语法。
接口与类
TypeScript接口是一系列抽象方法的声明。在TypeScript中,接口是一个非常灵活的概念,需要由具体的类去实现。TypeScript使用接口声明接口。
ECMAScript在ES6之后的版本里完善了对类的支持。TypeScript实现了所有ES6中类的功能,并进行了扩展。下面介绍TypeScript扩展的部分。TypeScript增加了3种成员访问修饰符:public、private和protected。其中public指属性或方法是公有的,在任何地方都可以访问到;private指属性或方法是私有的,只能在类内部访问;protected和private类似,区别是protected在子类中是允许被访问的。
readonly是只读属性关键字,只允许出现在属性声明、索引签名或构造函数中。修饰符和readonly还可在构造函数参数中使用,等同于在类中定义属性时赋值,使代码更简洁。
抽象类不允许被实例化,抽象方法须被子类实现。TypeScript用abstract定义抽象类和方法。
JavaScript与TypeScript的区别
TypeScript可以使用JavaScript中的所有代码和编码概念,TypeScript是为了使JavaScript的开发变得更加容易而创建的。例如,TypeScript 使用类型和接口等概念来描述正在使用的数据,这使开发人员能够快速检测错误并调试应用程序。
参考资料
微软发布 TypeScript 5.0 版本:体积更小、开发者更容易上手.腾讯网.2025-03-12
微软宣布将 TypeScript 性能提高 10 倍.百家号.2025-03-12
TypeScript 诞生 10 周年.腾讯.2025-03-12
微软正式发布TypeScript 0.9下载.IT之家.2025-03-12
TypeScript 1.0 正式版发布!.OSCHINA社区.2025-03-12
TypeScript 2.0 is now available.Microsoft.2025-03-12
TypeScript 3.0 正式发布:引入“项目引用”新概念.OSCHINA社区.2025-03-12
微软发布TypeScript 5.8,提升代码安全性、模块兼容性及编译性能.腾讯网.2025-03-14
微软 TypeScript 4.0 正式版发布.新浪科技.2025-03-12
What is TypeScript?.typescriptlang.2022-11-16
TypeScript入门教程.xcatliu.2025-03-14
TypeScript VS JavaScript 深度对比.阿里云开发者社区.2025-03-14