TypeScript 与 JavaScript 的区别

很多小伙伴在刚接触 TypeScript 时,心里总会有一个疑问:“既然 TypeScript 最终都要编译成 JavaScript 才能运行,那我为什么不直接写 JavaScript 呢?这不是多此一举吗?”

其实,存在即合理。TypeScript 如今能称霸整个前端工程化生态,必然有它不可替代的优势。这一节,我们来详细对比一下 TypeScript 与 JavaScript 之间到底有什么区别。

TypeScript 与 JavaScript 核心区别在哪?

通俗点来说,JavaScript 是一位 “随性的艺术家” ,而 TypeScript 是一位 “严谨的工程师”。它们的区别主要体现在以下 3 个方面。

1. 动态类型 vs 静态类型(最核心区别)

  • JavaScript 是一门动态类型语言。意思是说,变量的类型是在 “程序运行期间” 才确定下来的。我们完全可以把一个数字赋值给变量,下一秒又把它变成字符串,系统完全不管。只有当代码真正在浏览器里跑起来,遇到无法执行的操作时,它才会抛出错误导致页面崩溃。
  • TypeScript 是一门静态类型语言。意思是说,变量的类型在 “代码编写期间” 就已经确定了。如果我们规定了一个变量是数字,那么就绝对不能塞一个字符串进去。TypeScript 会在代码编译阶段(甚至在你敲代码的瞬间)就已经把错误揪出来。

2. 编译过程的区别

  • JavaScript:不需要编译,写完 “.js” 文件后,直接扔给浏览器或 Node.js 就能运行。(解释型语言)
  • TypeScript:浏览器和 Node.js 都不认识它。写完 “.ts” 文件后,必须经过 TypeScript 编译器(tsc)的编译,转换成普通的 “.js” 文件后,才能被真正执行。

3. 面向对象(OOP)的增强

虽然现代的 JavaScript(ES6+)也引入了 “类(class)” 的概念,使得我们可以使用 JavaScript 进行面向对象编程。但是 TypeScript 在此基础上做了大量的增强,并引入了传统的后端语言(如 Java、C#)中才有的概念,包括:

这些特性的加入,使得前端也能像编写大型后端架构一样,写出更加规范、高可复用的代码。

4. 零运行时开销(性能一致)

很多小伙伴可能会担心:“TypeScript 增加了这么多严格检查和高级特性,运行起来会不会比普通的 JavaScript 慢啊?”

答案是:绝对不会!这是因为 TypeScript 的所有类型检查和限制,仅仅发生在 “编译阶段”。当 TypeScript 被编译为 JavaScript 之后,所有与类型相关的代码都会被彻底抹除。因此,最终在浏览器或 Node.js 中运行的代码,就是纯净的 JavaScript ,它不会带来任何额外的运行时性能负担。

TypeScript 和 JavaScript 代码对比

光说理论有点抽象,我们来看一个常见的例子:获取用户对象的名称。

示例 1:JavaScript 的隐患

function printUserName(user) {
    console.log(user.name);
}

// 正常调用
printUserName({ name: "Jack", age: 20 }); 

// 错误调用:传入一个没有 name 属性的对象
printUserName({ age: 20 }); 

// 错误调用:什么都不传
printUserName();

运行结果如下。

Jack
undefined
(报错)TypeError: Cannot read properties of undefined (reading 'name')

分析:

对于 JavaScript 代码来说,如果程序还没运行,编辑器是根本不知道 user 是什么东西来的。

当我们运行 “错误调用 1” 时,控制台会输出 undefined,这可能导致后续的逻辑全部错乱。

当我们运行 “错误调用 2” 时,程序会直接崩溃,抛出如下致命错误。这种错误往往藏在深处,只有用户点到那个页面时才会爆发。

TypeError: Cannot read properties of undefined (reading 'name')

示例 2:TypeScript 的降维打击

// 定义接口,限制 User 对象必须长什么样
interface User {
    name: string;
    age: number;
}

// 限制参数 user 必须符合 User 接口的规范
function printUserName(user: User) {
    console.log(user.name);
}

// 正常调用
printUserName({ name: "阿莫", age: 20 }); 

// 错误调用 1
printUserName({ age: 20 }); 

// 错误调用 2
printUserName();

分析:

在 TypeScript 中,一切变得极其严谨。当我们尝试写入 “错误调用 1” 和 “错误调用 2” 的代码时,VS Code 就直接给代码 “飘红” 了,如下图所示。

VS Code 飘红报错

当我们将鼠标移到飘红的地方,VS Code 也会给出相应的错误提示。也就是说,在 TypeScript 的保护下,这种低级而致命的错误,根本就没有机会活到代码运行的那一刻。

TypeScript 和 JavaScript 对比表

为了方便小伙伴们能够有一个整体的印象,我们把 TypeScript 和 JavaScript 的区别总结成下:

JavaScript vs TypeScript
JavaScript TypeScript
类型系统 动态类型(运行时检查) 静态类型(编译时检查)
运行环境 浏览器、Node.js 直接运行 必须先编译成 JavaScript 才能运行
代码错误 运行时才容易暴露隐患报错 编写代码时(编译期)直接拦截报错
智能提示 较弱,编辑器只能靠猜 极强,基于类型系统提供精准提示
学习曲线 平缓,容易上手 稍陡,需要掌握类型和面向对象思维
适用场景 简单的页面交互、小型项目、快速原型 大型企业级项目、多人协作、复杂架构

我应该选择 TypeScript,还是 JavaScript?

看到这里,小伙伴们可能会问:“既然 TypeScript 那么棒,我是不是以后再也不用写 JavaScript 了呢?”

我们倒没必要从一个极端走到另一个极端。因为技术的选择,永远都是要看业务场景的:

  • 什么时候用 JavaScript?如果你只是想写一个几十行代码的小脚本(比如写个网页轮播图,或者简单的表单验证),或者是一个快速验证想法的个人小 Demo,此时直接用 JavaScript 是最快的,没必要引入 TypeScript 增加配置成本。
  • 什么时候用 TypeScript?如果你们是一个团队在开发,项目稍微有点规模(比如后台管理系统、大型电商网站),或者在用 Vue、React 等现代框架做企业级项目。那么请毫不犹豫地选择 TypeScript!虽然它在前期需要多敲几行类型代码,但在后期的长期维护中,能够帮你节省无数个抓狂找 bug 的深夜。

此外,还有很多小伙伴可能会担心:“如果我使用了 TypeScript,是不是以前那些优秀的 JavaScript 第三方库(比如 jQuery、Lodash、Echarts)都不能用了?”

这一点完全不用担心!TypeScript 拥有极其强大的生态兼容能力。通过引入 “声明文件(.d.ts)”,TypeScript 能够为现有的纯 JavaScript 库赋予强大的类型提示。而且,目前市面上绝大多数主流的 JavaScript 库,都已经自带了类型声明,或者在社区中有现成的类型包可供直接下载。

最后想跟小伙伴们说一句:作为初学者,没必要对 TypeScript 感到恐惧。我们可以把它当成 “带有类型提示的升级版 JavaScript” 来学。只要你的 JavaScript 基础够扎实,学习 TypeScript 只是顺水推舟的事情。

提示: 在接下来的学习中,强烈建议大家使用 VS Code 作为开发工具。这是因为 VS Code 本身就是使用 TypeScript 开发的,它与 TypeScript 可以说是 “亲兄弟”。在 VS Code 中编写 TypeScript 代码,无需进行任何复杂的配置,就能直接获得强大的代码智能提示、自动补全以及实时的错误飘红检查,这将极大地提升你的学习体验!

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号