TypeScript 用起来真是太痛苦了

在这里插入图片描述

此前我写了几篇文章,关于 Electron,关于 Vue,创建项目的时候,我都默认选择了使用 TypeScript 的模板,不过我都加了一句话,初学者如果不想自己找麻烦的话,最好不要使用 TypeScript。原因呢,也很简单,因为不但用起来很痛苦,配置起来也很痛苦。

一、什么是 TypeScript?

TypeScript 是由微软开发的一个开源编程语言。它是 JavaScript 的一个超集,这意味着它包含了 JavaScript 的所有功能,并且在此基础上增加了静态类型检查和其他一些特性。TypeScript 的目标是开发大型应用程序,提供更好的代码组织、维护和协作能力。

以下是 TypeScript 的一些关键特性:

  1. 静态类型检查

    • TypeScript 最显著的特性是它的静态类型系统。开发者可以在代码中为变量、函数参数、返回值等指定类型。这有助于在编译时捕获潜在的错误,而不是在运行时。
  2. 类和接口

    • TypeScript 支持面向对象编程的类和接口。这使得开发者可以创建复杂的数据结构和封装代码,从而提高代码的可读性和可维护性。
  3. 模块系统

    • TypeScript 提供了一个模块系统,允许开发者将代码分割成独立的模块。这有助于组织大型项目,并支持模块化开发。
  4. 编译到 JavaScript

    • TypeScript 最终会被编译成纯 JavaScript 代码,这意味着它可以在任何支持 JavaScript 的环境中运行,包括所有现代浏览器和 Node.js。
  5. 工具和编辑器支持

    • TypeScript 拥有广泛的工具和编辑器支持,包括 Visual Studio Code、WebStorm、Sublime Text 等。这些工具提供了代码高亮、自动补全、类型检查和重构等功能。
  6. 兼容性

    • TypeScript 旨在与现有的 JavaScript 代码库兼容。它支持最新的 ECMAScript 标准,并且可以配置以兼容旧版本的 JavaScript。
  7. 装饰器

    • TypeScript 引入了装饰器(Decorators),这是一种特殊的声明,可以附加到类声明、方法、访问器、属性或参数上。装饰器为 TypeScript 代码提供了一种新的扩展机制。
  8. 高级类型

    • TypeScript 提供了高级类型,如联合类型(Union Types)、交叉类型(Intersection Types)、字面量类型、类型别名、类型断言等,这些特性使得类型管理更加灵活和强大。

TypeScript 的目标是让开发者能够编写更健壮、更易于维护的代码,同时享受现代 JavaScript 开发的所有优势。它在大型项目和企业级开发中尤其受欢迎,因为它可以帮助团队更有效地协作和管理代码。

二、使用 TypeScript 带来的麻烦

在项目中实际使用 TypeScript 的时候,会产生许多的麻烦,下面我来说说,都有哪些。

1. 编写代码

在写所有的代码的时候,都要声明类型,比如:


function printNumber(num: number) {
  console.log(num)
}

上面的代码里,声明了一个 number 类型的参数,如果只是这种程度,远远算不上麻烦,比起能带来的好处如第一章介绍的来说,这点麻烦不值一提。

我觉得真正的麻烦在于,我们编写代码的时候,都不是孤立的。往往会结合很多的类库,或者框架。这时候麻烦就来了。很多类库、框架都是老牌的,那么这些是否都提供了对应的 TypeScript 版本呢?未必。

如果提供了 TypeScript 版本,那么类型定义是否都完整提供了呢?未必。

如果提供了类型的完整定义,那么是否提供了详细的使用文档呢?未必。

我举个例子,比如我在使用 Vue 3 开发的 Element Plus,这么有名的框架,当然使用 TypeScript 开发的,不过,看看这个:

<template>
<el-tree-select @onCheck="onCheck"></el-tree-select>
</template>
<script lang="ts" setup>
function onCheck(data, node, treeNode, event) {
//...
} 
</script>

如果,用比较严格和规范的方式去编写,那么请问这个 onCheck 回调的四个参数的类型应该如何去声明呢?其实,这四个参数是 Element Plus 框架里的 ElTree 组件的回调,这个参数的类型,高度依赖了 UI 框架内部的类型定义,但是怎么导出这四个类型呢?太难了!

2. 项目异构

现在的项目结构一般都很复杂,每个不同的部分又使用不同的标准。举个例子,比如我的 Electron 项目,Node 的部分,遵循 node 的标准,甚至不支持 ES Module,而 Vue 的部分,遵循的是浏览器的标准,这两者显然就不一样,如果用了 TS 的话,那么显然需要两份配置。

这就给项目的配置带来了极大的麻烦,我折腾这么久,就没彻底弄明白过。比如,怎么让 node 的 TS 用一套规则,Vue 用一套规则,还要井井有条,还要集中调用,最好前后台还能共享一些类的定义。

另外,如果你的项目里有测试,测试又是单独的一套,而我既要测试 node 的代码,又要测试 Vue 的代码,那不得了,又要分裂了。

3. 工具链嵌套

比如在 Vue 的项目里,代码文件都是 vue 扩展名的,默认情况下 tsc 肯定是无法识别的,所以就要用到 vue-tsc,但是实际上,我们在编译的时候,用的又是 Vite,显然 Vite 内部也会调用编译的功能,那么在 Vite 的配置里和 TS 又是怎么交互的呢?

在我的 Electron 里,我用了集成式的打包工具 Electron Forge,这个工具会调用 electron 命令,里面又整合了 Vite-Plugin,里面又…… 就…… 俄罗斯套娃🪆,感受一下。

这一切,都让每件事情都变得格外痛苦。困难加倍。

4. 调试困难

tsc 这种命令,文档什么的我就不说了,调试是非常困难的,比如你要写个配置文件然后尝试运行 tsc 命令,但是输出了错误信息,你怎么判断哪条配置造成了问题呢?只能用控制变量法和排除法一条一条地尝试。这就很糟糕了。

三、解决办法

现在我解决这一类问题,也没有什么太好的法子,就是只能自己硬着头皮去看文档,所得是有的,就是很慢。

助力比较大的是,基于别人的项目模板去创建项目脚手架,但是这种预设的东西,终究不是完全符合自己心意的,比如 Vue 的脚手架和 Electron 的脚手架怎么合并成一个项目呢?要么用社区爱好者自己写的模版,要么就得自己研究。终究还是困难的。

第二个办法,就是从别人的项目里看,阅读别人的配置文件来学习具体的做法,比如阅读官方模板里的配置文件,我觉得就很有帮助,使用 AI 来辅助阅读,也是最近一个很好的法子。既然 LLM 那么强大,何不用来学习呢?

实际配置实践中,则是需要用到各种预制的配置,基于这个基础去补充或者改编,以减低工作量。

四、总结

本文介绍了使用 TypeScript 中的一些感想,简单介绍了什么是 TypeScript,有什么特性和优点,为什么要使用。以及实际使用中,带来的各种困扰。最后是博主尝试后做出的努力方向和解决方法。希望对各位有启发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/413515.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT-Day5

思维导图 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);if(!db.contains("stuInfo.db")){//说明数据库不存在db QSqlDatabase::addDatabase("…

TikTok矩阵系统的功能展示:深入解析与源代码分享!

今天我来和大家说说TikTok矩阵系统&#xff0c;在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、交流思想和娱乐放松的重要渠道&#xff0c;其中&#xff0c;TikTok作为一款全球知名的短视频社交平台&#xff0c;凭借其独特的创意内容和强大的算法推荐系统&#…

20. 【Linux教程】emacs 编辑器

前面小节介绍了如何使用 vim 编辑器和 nano 编辑器&#xff0c;本小节介绍 emacs 编辑器&#xff0c;emacs 编辑器最开始是作为控制台的编辑器&#xff0c;并且 emacs 编辑器仍然提供最早的命令行模式。 1. 检查 Linux 系统中是否安装 emacs 编辑器 使用如何命令检查 emacs 编…

小主机折腾记22

最近总是心不在焉&#xff0c;于是决定把家里的海景房机箱升级下&#xff0c;顺便把之前剩的x99散热器&#xff0c;蓝宝石RX590&#xff0c;内存硬盘等利用上 咸鱼买了一个长城G6 淘宝买了一张X99D4M4&#xff08;4相8倍供电那款&#xff09; 今天主板到了&#xff0c;开整 先测…

DO-248C:Do-178C和Do-278A的支持信息-常见问题解答 (FAQ) (2)

3.0 常见问题解答 (FAQ) FREQUENTLY ASKED QUESTIONS (FAQ) 本节汇总了 DO-178C 和 DO-278A 常见问题解答。 常见问题解答的目的是对业界经常提出的有关 DO-178C 和/或 DO-278A 材料的问题提供简短而简洁的答复。 这些问题经常向认证机构或提供 DO-178C 和/或 DO-278A 解释的其…

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

四、分类算法 - 决策树

目录 1、认识决策树 2、决策树分类原理详解 3、信息论基础 3.1 信息 3.2 信息的衡量 - 信息量 - 信息熵 3.3 决策树划分的依据 - 信息增益 3.4 案例 4、决策树API 5、案例&#xff1a;用决策树对鸢尾花进行分类 6、决策树可视化 7、总结 8、案例&#xff1a;泰坦尼…

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

模板的初阶

目录 【本节目标】 1.泛型编程 2.函数模板 2.1函数模板概念 2.1 函数模板格式 2.3函数模板的原理 2.4函数模板的实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 如何实现…

jeesite用字典项配置二级下拉选

1、配置字典项 2、html代码&#xff1a;修改下拉选项框 <div class"col-xs-6"><div class"form-group"><label class"control-label col-sm-4" title""><span class"required">*</span> ${…

电脑桌面备忘录怎么设置?如何在电脑桌面上添加便签?

在日常生活中&#xff0c;电脑桌面上的便签功能可以帮助我们更有效地管理待办事项和重要信息。下面就让我们一起来学习电脑桌面备忘录怎么设置&#xff0c;如何在电脑桌面上添加便签吧。 首先&#xff0c;我们需要找到操作系统中的“小部件”或“小工具”选项。通常情况下&…

[C++][linux]Linux上内存共享内存用法

一&#xff0c;什么是共享内存 共享内存&#xff08;Shared Memory&#xff09;&#xff0c;指两个或多个进程共享一个给定的存储区。进程可以将同一段共享内存连接到它们自己的地址空间中&#xff0c;所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由用C语言函…

【JavaSE】输入输出处理

目录 File类常用方法代码示例 流分类字节流输入流字节流输出流字节流复制粘贴效果字符流输入流字符流输出流Buff版输入输出流二进制流序列化和反序列化 File类 File file new File( String pathname ); 常用方法 代码示例 public static void main(String[] args) {//1.创建…

用友U8 Cloud BlurTypeQuery SQL注入漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud BlurTypeQuery接口处存在SQL注入漏洞,未授权的攻击者可通过此漏洞获取数据库权限,从而盗取用户数据,造成用户信息泄露。 …

基于uniapp框架的古汉语学习考试系统 微信小程序python+java+node.js+php

1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果需要其它操作时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。 2、管理员的功能及权限 用户信息的添加和管理&#xff0c;古汉语信息加和管理和学习视频添加和管…

片上网络NoC

本文大部分内容来源于王志英老师主编的《片上网络原理与设计》以及网络&#xff0c;部分内容是本人理解所得&#xff0c;若有不当之处请指教 一、概述 片上网络将报文交换的思想引入芯片内部通信机制中&#xff0c;尽管片上网络和片外网络具有一定相似性&#xff0c;但二者在…

Ethernet/IP转Modbus TCP网关

产品功能 1 YC-EIP-TCP工业级EtherNet/IP 网关 2 Modbus TCP 转 EtherNet/IP 3支持ModBus主从站 4 即插即用 无需编程 轻松组态 ,即实现数据交互 5导轨安装 支持提供EDS文件 6 EtherNET/IP与ModBus互转数据透明传输可接入PLC组态 支持CodeSys/支持欧姆龙PLC 支持罗克韦尔(AB) 典…

RISC-V SoC + AI | 在全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo

引言 D1 是全志科技首款基于 RISC-V 指令集的 SoC&#xff0c;主核是来自阿里平头哥的 64 位的 玄铁 C906。「哪吒」开发板 是全志在线基于全志科技 D1 芯片定制的 AIoT 开发板&#xff0c;是目前还比较罕见的使用 RISC-V SoC 且可运行 GNU/Linux 操作系统的可量产开发板。 n…

代码随想录算法训练营第25天—回溯算法05 | *491.递增子序列 *46.全排列 47.全排列 II

*491.递增子序列 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1EG4y1h78v 考点 回溯子集去重 我的思路 暴力法&#xff0c;不进行去重&#xff0c;仅在最后加入结果时判断当…

探索比特币现货 ETF 对加密货币价格的潜在影响

撰文&#xff1a;Sean&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 自美国比特币现货交易所交易基金&#xff08;ETF&#xff09;上市以来&#xff0c;比特币现货 ETF 的相关信息无疑成为了影响比特币价格及加密货币市场走向…