
尽管它们有很多相似之处,但**JavaScript(JS)是否真的比TypeScript(TS)**好--或者反过来说--在于它们的差异。
本文试图解释这两种语言之间目前的主要对比,并提供各自的代码示例。此外,我们将解释JS和TS是否是面向对象的编程(OOP)语言,以及开发人员应该学习哪一种。
最后,我们将披露哪种语言更好!正如我们所知,JavaScript是一种对网络的成功有很大贡献的语言。是时候让TypeScript取而代之了吗?让我们拭目以待。
目录
什么是JavaScript?
什么是TypeScript
TypeScript和JavaScript的区别
➤定义
➤编译
➤类型化
➤JavaScript是一种面向对象的编程(OOP)语言吗?
TypeScript与JavaScript:代码示例
TypeScript比JavaScript好吗?
TypeScript 与JavaScript:学习哪一种?
结论
什么是 JavaScript?
JavaScript(JS)是世界上最流行的编程语言。它被认为是一种高级语言,有助于创建互动和动态网页。与HTML和CSS一起,JavaScript也是网络应用的核心技术之一,其动态类型和**即时编译器(JIT)**的特点非常突出。
另外,由于它能够支持函数式编程、命令式编程风格和事件驱动编程,因此它是一种多范式语言。JavaScript遵循客户端的实现方式(当脚本在用户的浏览器上运行时)。然而,它也有允许服务器端实现的引擎(脚本在网络服务器上运行,并根据每个用户的请求定制响应)。
JavaScript开始作为服务器端技术脱颖而出,主要是由于Node.js的发展和普及。尽管如此,用JavaScript处理大型复杂的应用程序并不容易,因为随着代码的增长,它变得更难维护和重用。因此,尽管有好处,服务器(后端)上的JavaScript也使事情变得更加混乱,处理起来更加复杂。为了克服这种纠结,微软推出了TypeScript。
从JavaScript中得到的主要启示
- 最受欢迎的编程语言。
- 全面的、跨平台的、多范式的、动态的语言。
- 客户端和服务器端的实现。
- JIT编译。
- 与所有浏览器兼容。
- 为小型脚本而开发。
什么是Typescript?
如前所述,JavaScript可以管理数以百计的代码行,但它不是为了处理非常广泛和复杂的应用程序而开发的。因此,TypeScript(TS)是JavaScript的一个超集,实现了与JavaScript相同的目的。然而,它是为了处理和开发更大的应用程序而创建的,因为它是强类型的,并且包括编译时错误控制。
更确切地说,TypeScript是一种支持静态和动态类型的编程语言,并进一步提供了继承功能、类、可视范围、命名空间、接口、联盟和其他现代功能。此外,它还可以实现注释、变量、函数、语句、模块和表达式。
TS可以用于客户端和服务器端的应用。此外,JavaScript库也与TypeScript兼容。
TypeScript的主要启示
- JavaScript的超集,因此与JS库兼容。
- 强类型的、已编译的语言,可以遵循OOP原则。
- 更容易调试。
- 提供静态类型化。
- 提供全面的IDE支持。
- 可以将其代码转换为JavaScript代码。
TypeScript与JavaScript的区别
定义
第一个值得一提的区别是,JavaScript 是一种脚本语言,有助于创建互动和动态网页,而 TypeScript 是 JavaScript 的强类型超集。
总而言之,TypeScript 是带有额外功能的 JavaScript,其开发目的是克服 JavaScript 的缺陷,尤其是在静态类型和处理代码复杂性方面。
编译
一方面,使用JavaScript时不需要编译。因为它是一种解释型语言,错误只能在运行时被发现。换句话说,它首先需要运行才能被测试并被认为有效或无效。因此,可能需要花很多时间来发现代码中的bug和错误。
另一方面,TypeScript有一个编译时错误功能,正如其名称所示,它编译代码并检查可能在语法中发现的编译错误。这个功能可以在运行脚本之前为开发者节省宝贵的时间。此外,它还可以避免一些错误进入生产,所以它也有助于企业,而不仅仅是开发人员。
类型化
Javascript有动态类型(即,一个变量现在可以是一个整数,以后可以是一个字符串)。这使得我们很难知道如何处理一个特定变量中的内容。此外,它不提供静态类型。静态类型意味着开发者声明一个变量可以拥有的数据类型。例如,如果'x'被声明为只指向整数,那么一旦你要在里面放一个字符串,编译器就会给出一个错误。与JS相反,TypeScript是强类型化的,并且可以实现静态和动态类型化(它是可选的)。
静态类型可能是使用TypeScript的主要优势。它允许开发人员在编译时检查类型的准确性。例如,JavaScript提供了像string 和number 这样的语言基元,但它并不检查开发者是否已经一致地分配了这些基元。TypeScript则是如此。
此外,在现代开发环境(如VS Code)中使用TS静态类型,可以提供关于开发者代码的额外信息和正确建议,有助于改善文档(其他开发者也喜欢)。代码导航和重构也是可用的功能,可以帮助开发者跟踪特定的函数和声明的位置,等等。另外,如前所述,总的来说,TS使人们更容易发现错误和bug。
JavaScript是一种面向对象的编程(OOP)语言吗?
ECMAScript是一个脚本语言的标准;它提供了规则、指南和其他细节,描述了脚本语言应该包含的内容。JavaScript是一种符合ECMAScript规范的脚本语言。这些规范可以改变,也可以引入新的规范;因此,ECMAScript有几个版本。引入最重大修改的版本之一是ECMAScript 6(也被称为ES6或ECMAScript 2015)。这个版本引入了模块、类、箭头函数、增强的对象属性,以及其他令人兴奋的功能。
在JavaScript的ES6发布后,确实引入了类的概念。然而,这是JavaScript的原型继承的一个语法特征。JS是基于原型的,而不是基于类的。因此,JavaScript不被认为是一种纯粹的面向对象的编程语言,尽管它能够遵循一些面向对象的编程原则。
TypeScript是一种面向对象的编程(OOP)语言吗?
这个问题的答案并不那么直接。一方面,TypeScript 具有类和其他功能,允许开发人员遵循 OOP 原则和技术。
另一方面,它不是一种有主见的语言,也就是说,它不会像某些语言(如Java和C#)那样 "强迫 "开发者遵循面向对象的原则。因此,TS通常不被认为是一种纯面向对象的编程语言。
事实上,在TypeScript中,开发者也可以选择指令性或功能性代码,而不是面向对象的代码。因此,如前所述,JavaScript和TypeScript都是多范式语言。
TypeScript与JavaScript:代码示例
JavaScript代码示例
const mars = {
name: "Mars",
gravity: 3.721
};
mars.mass; // returns undefined
function weight(mass, gravity) {
return mass * gravity;
}
TypeScript代码:显式类型
// Explicit Types
let destination = "Mars"; // it's the same as let destination: string but TS infers by itself
TypeScript代码:使用枚举
// We can use enums
enum Professions { Astronaut, RocketScientist, Mechanic }
TypeScript编译为JavaScript:使用枚举
// We can use enums
var Professions;
(function (Professions) {
Professions[Professions["Astronaut"] = 0] = "Astronaut";
Professions[Professions["RocketScientist"] = 1] = "RocketScientist";
Professions[Professions["Mechanic"] = 2] = "Mechanic";
})(Professions || (Professions = {}));
TypeScript 代码:使用类型别名
// We can also use type aliases
type Person =
{ type: Professions.Astronaut, name: string, isAtSpace: boolean} |
{ type: Professions.RocketScientist, name: string }
TypeScript代码:使用接口
interface Planet {
name: string;
gravity: number;
asteroids?: string[] | string; // optional property (?) and narrowing where we can assign more than one type
}
const mars: Planet = {
name: "Mars",
gravity: 3.721
};
mars.mass; // throw an error: Property 'mass' does not exist on type '{ name: string; gravity: number }'.
TypeScript 代码:使用 Parameter 类型注释
// Parameter type annotation
function weight(mass: number, planet: Planet) {
return mass * planet.gravity;
}
function printAsteroids(planet: Planet) {
if (Array.isArray(planet.asteroids)) {
console.log("Asteroids: " + planet.asteroids.join(", "));
} else {
console.log("Asteroids: " + planet.asteroids);
}
}
TypeScript 比 JavaScript 好吗?
从下面的图片中我们可以观察到,JavaScript多年来一直是第一大编程语言,但TypeScript自2017年以来的人气增长也是众所周知的。

2020年的Octoverse状态|Github
看完这两种语言的主要区别,似乎用不了多久TypeScript就会追上JavaScript,但它真的比JS好吗?
嗯,项目的规模是一个需要考虑的重要变量。对于较小的项目来说,TypeScript并没有真正脱颖而出,可能不值得花费精力。在这种情况下,JavaScript可能更有优势,因为它可以到处运行(跨平台),而且非常轻巧。事实上,与JavaScript相比,TypeScrit的缺点之一是它不能在每个浏览器上运行,这意味着必须使用TypeScript编译器或Babel插件来将TS代码转化为普通JS,使其对所有浏览器都能理解。
另外,考虑到它不是强类型的,JS也可以实现更快的编码,尽管不是很适合更大和更复杂的应用程序。此外,TypeScript需要一些时间和CPU资源来编译代码,而且与JavaScript不同的是,它不会立即在浏览器中显示变化(需要几秒钟)。
尽管如此,正如我们在本文中所解释的那样,似乎很清楚TypeScript是中等和大型项目的首选。事实上,它是为这些项目明确设计的。
首先,在TypeScript中更容易重构代码。 其次,TS更依赖于显式类型,使开发者和团队能够更好地理解不同部分的交互方式。最后但并非最不重要的是,TypeScript通过编译时检查来识别错误和其他错误。这些功能可以提高在大规模系统中工作时的效率和组织。
另外,TypeScript与JavaScript非常相似,可以使用JS拥有的所有库、工具和框架,所以当涉及到更复杂的项目时,绝对值得在TS上试一试。
TypeScript与JavaScript:学习哪一个?
要学习TypeScript,开发人员必须首先学习JavaScript。开发人员对JavaScript了解越多,学习TypeScript就越容易,因为这两种语言共享相同的语法以及相同的运行时行为(除了TS有一个编译时检查器)。
作为最流行的语言,JavaScript有很多可用的资源和一个庞大的社区。在大多数情况下,TypeScript开发者也可以从这些资源中受益,因为任务的执行方式将是相同的。
总结
JavaScript是一种令人难以置信的语言;否则,它就不会成为这么多年来最受欢迎的语言。然而,这并不意味着它是完美的(完美的编程语言甚至存在吗)。当涉及到处理大型项目时,在JavaScript中事情会变得混乱和令人困惑。因此,微软开发了TypeScript。
TypeScript几乎是JavaScript加上扩展的能力。他们的主要区别是,TypeScript是强类型的,而JavaScript不是。此外,与JS不同的是,TS被设计为处理更大的项目,其原因在于这三个主要方面:
- 它更容易重构代码。
- 通过编译时的检查来识别bug和错误。
- 明确的类型。
一个比另一个好吗?是的,也不是。对于较小的项目,使用TypeScript的努力通常不会得到回报;因此,JavaScript可能更好。对于大型项目,是的,TypeScript更好,更有效率。