对 JavaScript 说“不”
JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。
它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。
它很快就变得非常流行,推动了 Web 应用程序革命,并得到了地球上几乎所有 Web 浏览器的支持。
如今,JavaScript 可能是世界上最常用的编程语言。
多年来,我一直说 JavaScript 之于 Web 浏览器就像汇编代码之于 CPU。
当然,汇编语言是一种强大的语言,就像 JavaScript 一样,但我们拥有高阶语言是有原因的。
鉴于如今浏览器才是真正的操作系统,JavaScript 应该——而且最终会——在开发人员的心中走上汇编语言的道路。
我并不否认 JavaScript 的成功和有效性。Web 就是建立在它之上的,尽管它存在很多缺陷,但人们还是用它做出了许多了不起的事情。
但我就是无法将 JavaScript 视为一种我们应该编写的语言,就像今天只有极少数开发人员编写汇编语言一样。
在构建 Windows 应用程序时,我更喜欢让编译器编写我的汇编语言,在构建 Web 应用程序时,我更喜欢让编译后的 TypeScript 为我编写 JavaScript。
TypeScript则是另一回事。现在有了一种编程语言。
TypeScript 由伟大的Anders Hejlsberg设计,它具有 JavaScript 的所有优点(例如它们本身),同时还添加了一个富有表现力和强大的类型系统。坦率地说,我不明白为什么有人会更喜欢 JavaScript 而不是 TypeScript。
为什么不使用 TypeScript?
首先,您可以按照自己的节奏开始使用 TypeScript。这不是全有或全无。所有 JavaScript 代码都是 TypeScript 代码。我(主要)开玩笑说,我很乐意收取一笔不小的费用,将所有 JavaScript 开发团队转变为 TypeScript 开发人员,只需将所有 *.js 文件更改为 *.ts 文件即可。
通过这一更改,他们将成为一家 TypeScript 商店,他们根本不需要改变编写代码的方式。然后他们可以逐渐开始按照自己的意愿使用 TypeScript。
我缺乏理解进一步源于开发人员对使用 TypeScript 的无力反对。
“所有这些类型都只是碍事而已”
好吧,当然,他们可能会妨碍你。你也许可以快速解决一些问题,并且了解你编写的代码的一切。
但是,当那些可怜的人看到你六个月或一年前的代码时,他们不得不试图弄清楚你在想什么,那该怎么办呢?(别介意那个可怜的人可能是你……)
这就像说“我想在一年内遇到无法预见的问题,而我却记不起所有这些代码应该做什么。”
通过输入所有内容,您可以清楚简洁地声明代码意图,并在整个代码库中执行这些意图。对于拥有许多开发人员的应用程序,能够清楚明确地表达代码的功能,这比需要其他开发人员花费认知精力才能弄清楚的代码具有巨大的优势。
“JavaScript 非常适合快速制作原型”
好吧,这没问题,但请考虑一下:我们都知道“原型”的概念有点可笑。可悲的是,将原型扔到一边并重新启动“真正的”应用程序的情况很少见。
原型成为真正的应用程序,您将永远陷入在匆忙拼凑原型时做出的糟糕基础决策中,您曾说过您永远不会部署原型,但最终还是部署了它。快速拼凑某物的能力并不是一种美德。
“JavaScript 非常适合初学者”
当我听到这个时,我想,“我希望崭露头角的开发人员学会以坏习惯来编码,而不是学习真正的编程语言是如何工作的。”
“打字打得太累了,我的手指都累了”
我的意思是,拜托。这是我听过开发人员给出的最糟糕的借口,我为那些认真提出这个借口的开发人员感到羞愧。
您可以在构建系统时键入内容,也可以在以后维护、重做和修复系统时进行更多键入。
因为键入内容太多而不想编写清晰、明确的代码是荒谬和懒惰的。
所有这些额外的键盘工作都可以让您充分表达代码的作用。您可以多键入一点。天哪。
“TypeScript 编译器只能发现小错误”
嗯,是的。完全正确。
“所有这些类型都存在太多错误”
嗯,是的。完全正确。
好吧,最后两条评论有点轻率。但错误才是重点。
TypeScript 编译器会发现错误,如果未通过测试发现,这些错误可能会在部署时出现。
在开发周期的早期发现问题总是更好的,没有什么比在您输入错误时立即显示一个小红色波浪线更早的了。
至于“错误太多”,嗯,这是一个功能。TypeScript 是精确的,编码时精确是好的和可取的。
使用 JavaScript 时,你可以用无数种方式来自讨苦吃。
我看到太多“猜猜这个 JavaScript 代码会输出什么!”的问题。如果一种语言中存在歧义和不精确,那么这种语言将导致有缺陷的代码。
如果您必须运行代码才能知道它的输出应该是什么,那么您的代码就是错误的。
“我可以使用单元测试来确保我的代码正常运行”
这是一个让我犹豫的论点。我喜欢单元测试和测试驱动开发,我认为我们都应该以这种方式编写代码,所以这个论点很有说服力。但后来我想起你也可以用 TypeScript 进行单元测试,所以这个论点有点站不住脚。
糟糕的编程语言,糟糕的代码
当您说“我可以用 JavaScript 快速开发”时,我听到的是“这个项目将成为维护的噩梦。”
当您说“我不喜欢所有那些冗长的内容。JavaScript 更简单、更简洁”时,我听到的只是“我喜欢当我回头看代码时,代码是难以理解的。”
当您说“我只想解决问题,而不是处理所有这些类型”时,我听到的是“我只想以后给自己制造一大堆问题。”
当您说“很难将类型放在所有东西上”时,我听到的是“哇,哇,哇,哇。”
最终,JavaScript 成为了在正确时间出现的正确事物。它最终被折叠、扭曲和肢解,用于它并不适合的用途。
这就是 TypeScript 出现的原因。TypeScript 利用了 JavaScript 的普遍性,同时添加了现代类型系统的所有功能。这就是您应该使用 TypeScript 的原因。
相关文章:

对 JavaScript 说“不”
JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。 它很快就变得非常流行,推动了 Web 应用程序革命&…...

spring下的beanutils.copyProperties实现深拷贝
spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝?可以实现深拷贝吗? 答案:浅拷贝。 一、浅拷贝深拷贝的理解 简单说拷贝就是将一个类中的属性拷贝到另一个中,对于BeanUtils.copyProperties来说,你必须保…...
蓝桥杯二分题
P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租…...

3D数字化革新,探索博物馆的正确打开新方式!
3D数字化的发展,让博物馆也焕发新机,比如江苏省的“云上博物”,汇聚江苏全省博物馆展陈资源,采取线上展示和线下体验两种方式进行呈现的数字展览项目。在线上,用户可以通过H5或小程序进入“云上博物”数字展览空间&…...
工业检测基础-工业相机选型及应用场景
以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据: 2D相机 检测原理:基于二维图像捕获,通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景:广泛应用于平面工件的外观检测,如检测…...

通过 FRP 实现 P2P 通信:控制端与被控制端配置指南
本文介绍了如何通过 FRP 实现 P2P 通信。FRP(Fast Reverse Proxy)是一款高效的内网穿透工具,能够帮助用户突破 NAT 和防火墙的限制,将内网服务暴露到公网。通过 P2P 通信方式,FRP 提供了更加高效、低延迟的网络传输方式…...

即时通信系统项目总览
聊天室服务端项目总体介绍 本项目是一个全栈的即时通信系统, 前端使用QT实现聊天客户端, 后端采⽤微服务框架设计, 由网关子服务统一接收客户端的请求, 再分发到不同的子服务上处理并将结果返回给网关, 网关再将响应转发给客户端 拆分的微服务包含: 网关服务器&…...

QT获取tableview选中的行和列的值
查询数据库数据放入tableview(tableView_database)后 QSqlQueryModel* sql_model new QSqlQueryModel(this);sql_model->setQuery("select * from dxxxb_move_lot_tab");sql_model->setHeaderData(0, Qt::Horizontal, tr("id&quo…...

GDPU 人工智能 期末复习
1、python基础 2、回归、KNN、K-Means、搜索方法思想及算法实现步骤 3、知识表示基本概念 4、状态空间的相关概念、表示方法及应用 5、图搜索策略及应用 6、问题归约概念、与或图搜索、博弈树搜索与剪枝 7、决策树、贝叶斯决策算法及其应用 8、神经网络与深度学习基本概念 一、…...

编程之路,从0开始:补充篇
Hello大家好!很高兴和大家又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《题海拾贝》、《数据结构与算法之美》 欢迎点赞,关注! 这篇…...
使用缓存提升Web应用性能:从新手到高手的实践指南
引言 在现代Web开发中,性能优化是确保用户体验和系统稳定性的关键。使用缓存是提升网站性能的有效手段之一,可以显著减少数据库访问和计算开销。根据“网站优化第一定律”,缓存可以提升网站的响应速度,减少延迟,从而改…...

【数字电路与逻辑设计】实验一 序列检测器
文章总览:YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验一 序列检测器 一、实验内容二、设计过程(一)作出状态图或状态表(二)状态化简(三)状态编码 三、源代码(一ÿ…...

运动模糊效果
1、运动模糊效果 运动模糊效果,是一种用于 模拟真实世界中快速移动物体产生的模糊现象 的图像处理技术,当一个物体以较高速度移动时,由于人眼或摄像机的曝光时间过长,该物体会在图像中留下模糊的运动轨迹。这种效果游戏、动画、电…...

养老护理员培训考试题库;免费题库;大风车题库
下载链接:大风车题库-文件 大风车题库网站:大风车题库 大风车excel(试题转excel):大风车excel...
Python-配置模块configparser使用指南
configparser 是 Python 标准库中的模块,用于处理配置文件(如 .ini 文件)。它适合管理程序的配置信息,比如数据库连接参数、应用程序设置等。 1. 配置文件的基本结构 配置文件通常是 .ini 格式,由 节(Sec…...
C++的HDF5库将h5图像转为tif格式:szip压缩的图像也可转换
本文介绍基于C 语言的hdf5库与gdal库,将.h5格式的多波段HDF5图像批量转换为.tif格式的方法;其中,本方法支持对szip压缩的HDF5图像(例如高分一号卫星遥感影像)加以转换。 将HDF5图像批量转换为.tif格式,在部…...

【JAVA】Java第十三节:String类(String相关方法,以及StrinBuftrer , StringBulder相关方法)
本文详细介绍了String类以及常用的String相关方法,以及StrinBuftrer , StringBulder相关方法的使用,建议有印象即可,不需要都记住,使用时去查取即可 一、创建一个String类型的变量 我们平时创建String类型的变量一般是第一种形式…...
WordPress安装或访问时出现数据库连接错误的处理方式
一、在安装时出现数据库连接错误 1、如果数据库名称、用户名或密码错误,或者主机设置不正确(如数据库服务器不是在本地localhost,而是在远程服务器,需要正确填写远程服务器的 IP 地址或域名),就会导致连接错…...

JAVA-面向对象基础
文章目录 概要封装多态抽象类接口内部类为什么需要内部类 概要 面向对象是一种编程范式或设计哲学,它将软件系统设计为由多个对象组成,这些对象通过特定的方式相互作用 封装 将数据和操作数据的方法封装在一个类中,并通过访问修饰符控制对…...

[Java]项目入门
这篇简单介绍一些入门的有关项目和行业的知识,并带着实现一个小项目。便于已经编程入门的各位准备进阶到下一个阶段。 先大致地介绍,一个完整的项目(不看客户端、服务端的分类)基本可以划分为三部分: 1.前端。比如你现在看到的CSDN页面就是一…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...