还没用熟 TypeScript 社区已经开始抛弃了

2023-11-07

6eddeb21b3ca4b5752c601fb65539606.png

前端Q

我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人~

公众号

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

根据 rich-harris-talks-sveltekit-and-whats-next-for-svelte[1] 这篇文章的报道, Svelte 计划要把代码从 TS 换到 JS 了。

The team is switching the underlying code from TypeScript[2] to JavaScript[3]. That and the update will then allow the team to incorporate “big ideas” for Svelte 5 later this year, he added.

这种震惊劲爆的信息,当然的核实下是不是准确的,于是去 svelte 框架的作者 Rich Harris 的推特去求证下,好奇的不止我一个,已经有人提问了,并且作者给出了答案,非常确定

27cf33ec62718103ff889736dc11d8cf.jpeg

最新消息,非常确定了,就在昨天,北京时间 2022 年 5 月 9 日,Svelte 团队发布了一个名为 TS to JSDoc Conversion[4] 的 PR,开始这项浩瀚的工程,同时宣布目前 Svelte 不再支持重大更新了,根据点不支持的人数,看到这件事情比较有争议,不支持的人不在少数。

de20cac9151d2370198f1c91677ddda2.jpeg
TS to JSDoc Conversion

事实上,这不是社区第一次放弃 TypeScript 了,比如 Deno 远在 2020 年就弃用了 TS[5],并给出三大理由:

  1. 减少了构建时间

  2. 发布代码变小了

  3. 写的代码大大减少了

那个时候 TyepScript 的发展正在如日中天的时候,广大库的作者普遍拥抱 TS,比如于2020年9月18日正式发布的Vue3 ,代号为 One Piece(海贼王)。

三年过去了,再好看的媳妇也看腻了,大家就开始挑毛病了,你(TyepScript)可能并不完美。

回归了理性,大家就开始思考使用 TyepScript 的初心是什么了,意识吼出了灵魂一问?我们为什么使用 TypeScript?

没错,这个问题很简单,因为 TypeScript 提供了类型检查,弥补了 JavaScript 只有逻辑没有类型的问题,也就是讲我们不需要 TypeScript 的逻辑,只需要它的的类型提示功能。但是不知不觉之间,我们在逻辑的道路上越走越远。

比如下面是 Vue3 watch API 的类型声明,我估计给一天时间,大多数人可能都不太能整的明白里面的逻辑:

export declare function watch<
  T extends MultiWatchSources,
  Immediate extends Readonly<boolean> = false,
>(
  sources: [...T],
  cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,
  options?: WatchOptions<Immediate>,
): WatchStopHandle;
export declare function watch<
  T extends Readonly<MultiWatchSources>,
  Immediate extends Readonly<boolean> = false,
>(
  source: T,
  cb: WatchCallback<MapSources<T, false>, MapSources<T, Immediate>>,
  options?: WatchOptions<Immediate>,
): WatchStopHandle;
export declare function watch<T, Immediate extends Readonly<boolean> = false>(
  source: WatchSource<T>,
  cb: WatchCallback<T, Immediate extends true ? T | undefined : T>,
  options?: WatchOptions<Immediate>,
): WatchStopHandle;
export declare function watch<T extends object, Immediate extends Readonly<boolean> = false>(
  source: T,
  cb: WatchCallback<T, Immediate extends true ? T | undefined : T>,
  options?: WatchOptions<Immediate>,
): WatchStopHandle;

而且如果项目引用了用 TypeScript 编写的库,需要频繁借助 VSCode 等编辑器查看源代码,才能进行类型声明继续编写逻辑代码。

以前我也是 TypeScript 的拥趸,但是使用了一两年之后,我改变了看法,平时应付业务逻辑已经够费脑子了,现在需要花不少时间去调整代码来适应需求。

除此之外,dev 开发代码进行类型检查也比较费时间,项目大了可能需要顿个几秒才能检查完成,再进行代码编译输出到浏览器。

现在明白了最初的需求,完全可以用 JavaScript + JSDoc[6] 来解决类型声明,现代编辑器是认的 JSDoc,友好支持程度一点不比 TS 差,如果是编写库,需要导出给安装者使用,那就在 .d.ts 文件中定义导出给使用者。

使用 JSDoc 表达类型,不仅省去了构建步骤,不打包都可以直接用,还可以避免编写复杂的类型逻辑,太方便了有没有,代码可以复制到任何 JS 的运行环境心动没有。

我们来实践看看行不行的通,光说不练,假把式。

这里以 Svgo 的一个函数 removeLeadingZero[7] 为例,这个函数可以删除小数的前导零并作为字符串返回,比如 0.5 → .5-0.5 → \-.5

const removeLeadingZero = (num) => {
 let strNum = num.toString();
 if (0 < num && num < 1) {
   strNum = strNum.slice(1);
 } else if (-1 < num && num < 0) {
   strNum = "-" + strNum.slice(2);
 }
  
 return strNum;
};

我们添加如何注释:

markdown

复制代码

`/**

  • Remove floating-point numbers leading zero.

  • @example

  • 0.5 → .5

  • @example

  • -0.5 → -.5

  • @type {(num: number) => string} */`

非常好用:

c0798a86cb28471a4bbe38ad179be003.jpeg
image.png

实际上 VSCode 有智能推断,简单的代码都能推断出来,比如,const num = 23; 会自动感应出来方法:

4a54815b7cd230bd0f427829180ea234.jpeg
image.png

说回来 removeLeadingZero 函数,当我们调用的时候,传入错误的参数,没有像 TS 类型强制报错:

464d761096cf54ed587380689c66df49.jpeg
image.png

解决办法也很简单,比如:

  1. 利用的 TS _\@ts-check_ 注释
  2. 添加 `tsconf.json` / `jsconfig.json` 并让 checkJs 为 true。
{
 "compilerOptions": {
   "checkJs": true
 },
 "exclude": ["node_modules", "**/node_modules/*"]
}
  1. 添加"js/ts.implicitProjectConfig.checkJs": true到您的工作区或用户设置里面即 settings.json 文件。

  2. 更多参考 type-checking-javascript[8]

改正后的效果:

f1d3e29be91e39725558dc2b1ed784a4.jpeg
image.png

事实上 JSDoc 的类型注释非常丰富比如还有 @param@const 等等,但不复杂,学习成本很低。

参考

  • rich-harris-talks-sveltekit-and-whats-next-for-svelte[9]

  • TypeScript vs JSDoc という対立は存在しない、と思った話[10]

  • removeLeadingZero[11]

  • type-checking-javascript[12]

  • how-to-use-jsdoc-annotations-with-vscode-for-intellisense-7co[13]

参考资料

[1]

https://thenewstack.io/rich-harris-talks-sveltekit-and-whats-next-for-svelte/

[2]

https://thenewstack.io/key-concepts/typescript/

[3]

https://thenewstack.io/jamstack-panel-multiple-javascript-frameworks-are-a-good-thing/

[4]

https://github.com/sveltejs/svelte/pull/8569

[5]

https://github.com/denoland/deno/pull/6793

[6]

https://www.typescriptlang.org/ja/docs/handbook/jsdoc-supported-types.html

[7]

https://github.com/svg/svgo/blob/main/lib/svgo/tools.js#LL128C7-L128C24

[8]

https://code.visualstudio.com/docs/nodejs/working-with-javascript#_type-checking-javascript

[9]

https://thenewstack.io/rich-harris-talks-sveltekit-and-whats-next-for-svelte/

[10]

https://qiita.com/fsd-tetsu/items/d8b50481b6c735ffa6f3

[11]

https://github.com/svg/svgo/blob/main/lib/svgo/tools.js#LL128C7-L128C24

[12]

https://code.visualstudio.com/docs/nodejs/working-with-javascript#_type-checking-javascript

[13]

https://dev.to/sumansarkar/how-to-use-jsdoc-annotations-with-vscode-for-intellisense-7co

关于本文

来源:CondorHero

https://juejin.cn/post/7218117377052377143

0651b75bd2186085263e19e2ce1ba655.png

往期推荐

我改了一行公共代码后,同事说要建个没我的小群

5f2fc45fe5e89fe65df5fc7c950a66c7.png

因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

d042f0e9069b13558862c61e37feffe1.png

Echarts无法实现这个曲线图,那我手写一个

5d1a0ba525838e3b2a8cff99497f6dfe.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

7a6ef3c0f6f7ab41588acf9d5f68cca6.png

前端Q

本公众号主要分享一些技术圈(前端圈为主)相关的技术文章、工具资源、学习资料、招聘信息及其他有趣的东西...

公众号

3fafcaa5b6f2d5dd1b7632ff2b0cee18.jpeg

99fdc0c505cae19b03e2572659da455c.png

点个在看支持我吧

1ccfd4284fe333e000e4f12bdddda57a.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

还没用熟 TypeScript 社区已经开始抛弃了 的相关文章

随机推荐

  • ensp模拟器中云设备的使用及相关问题解决办法

    ensp模拟器中云设备的使用及相关问题解决办法 eNSP工具中的云代表通过各种网络技术连接起来的计算机网络环境 目前可实现的功能包括 仿真设备之间建立映射关系 绑定网卡与仿真设备之间进行通信 以及通过开放UDP端口方式与外部程序进行通信 基
  • Oracle-SQL脚本记录

    多字段匹配关键词查询 旧写法 where email like abc or address like abc 组合查询写法 where concat email address like abc
  • c语言练习题 ATM机流程

    自学c语言自娱自乐的 看到有的练习题上有模拟ATM机流程的练习就试着写了一个 include
  • 开源的杀毒软件

    开源的杀毒软件 有 免费的午餐 我们为什么不吃呢 杀毒软件一定要购买或用D版吗 先别忙着下结论 请耐心看完本文 然后再告诉我你是怎么想的 一 ClamWin Free Antivirus 开源反病毒软件 GPL协议 SourceForge页
  • Vmware 分辨率设置

    1 点击查看 2 点击自动调整大小 3 选择自动适应客户机即可
  • 简单怕忘笔记

    1 and REGEXP LIKE 字段名 匹配串1 匹配串2 全模糊匹配 2 and REGEXP LIKE 字段名 匹配串1 匹配串2 右模糊匹配 3 and REGEXP LIKE 字段名 匹配串1 匹配串2 左模糊匹配 4 LTRI
  • GNSS精密单点定位(PPP)基本原理(进阶篇)

    上节介绍了精密单点定位的基本原理 本文继续在精密单点定位的基础上进行更深层次的介绍 一 精密单点定位的函数模型 上节说过 在精密单点定位之前 也有一种绝对定位技术 那就是伪距单点定位 伪距单点定位靠的伪距进行单点定位 但是伪距的精度较差 主
  • 字符串转int数据类型的三种方式

    方法一 Integer valueOf 它将返回一个包装器类型 Integer 当然可以通过自动拆箱的方式将其转成 int 类型 String a 100 String b 50 int A Integer valueOf a int B
  • 睿智的智能优化算法3——利用遗传算法实现字符串配对

    睿智的智能优化算法3 利用遗传算法实现字符串配对 字符串配对 求解过程 1 编码方式 2 计算适应度 3 自然选择 4 基因突变 5 个体杂交 实现代码 GITHUB下载连接 好久都没有用过遗传算法了 觉得需要重新复习一下 而且考虑到遗传算
  • hive窗口函数(开窗函数)

    一 窗口函数概述 窗口函数 Window functions 是一种SQL函数 非常适合于数据分析 因此也叫做OLAP函数 其最大特点是 输入值是从SELECT语句的结果集中的一行或多行的 窗口 中获取的 你也可以理解为窗口有大有小 行有多
  • Tomcat服务器配置Https协议

    前言 日常开发项目时 一般本机都是基于http协议 但是要实现某些需求必须要开启https协议 现在https协议已经成为主流 网站如果未开启https协议 浏览器会进行安全提示 本文以Tomcat服务器为例 简单介绍如何在本机开发环境配置
  • ② 尚品汇的前台开发笔记【尚硅谷】【Vue】

    文章目录 八 加入购物车 路由跳转之前发请求 api 请求接口 将数据存储到服务器里 判断加入成功 或 失败 成功后进行路由跳转 开始进行路由跳转 并进行路由传参 开始渲染页面 购物车静态组件与修改 九 完成ShopCart购物车模块业务
  • 使用algorithm中的sort进行vector的自定义排序

    名称 使用algorithm中的sort进行vector的自定义排序 说明 可以使用sort进行自定义排序 不过要定义比较函数 在此处的比较 函数为Compare 名字可以任取 在比较函数中 定义自己的排序方式 然后在sort函数中传入函数
  • idea将本地新项目上传至svn

    目录 第一步 将本地代码交给svn管理 第二步 将代码提交至svn 第一步 将本地代码交给svn管理 1 file gt setting进入设置 2 点击Version Control gt 点击 加号 gt 选择本地项目文件 gt 选择S
  • 修改Mysql数据库的用户名和密码【详细】

    数据库的用户名默认是root 1进入到Mysql 首先要登录数据库 1win r输入cmd 管理员身份打开 或者 2搜索输入命令提示符 2 输入mysql uroot p点击回车 注意 mysql默认用户名是root 我以前修改过 所以我输
  • 看起来很长但还是有用的Spring学习笔记

    本文首发于泊浮目的专栏 https segmentfault com blog Spring致力于提供一种方法管理你的业务对象 在大量Java EE的应用中 随处可见Spring 今天我将简单的介绍一下Spring这个框架 本文适合读者 想
  • Verilog中generate语句的用法

    在Verilog 2001中新增了语句generate 通过generate循环 可以产生一个对象 比如一个元件或者是一个模块 的多次例化 为可变尺度的设计提供了方便 generate语句一般在循环和条件语句中使用 为此 Verilog 2
  • DLL的引入方式(DllImport的特殊引入方式)

    Dll引入方式有四种 1 就是普通的比如一个解决方案中有多个项目 将其他项目的引入到该项目中 2 就是软件自带的程序集的引入 3 就是使用dll的引入 普通的本身就是VS的dll文件 4 就是使用dll的引入 不是属于该语言的vs的Dll文
  • 减少GC开销 &&可能出现内存泄漏的情况&&两个对象相互引用会不会被GC

    如何降低java GC开销 减少GC次数 其他详见 如何减少垃圾回收的次数 jvm虚拟机 1 选择一个较好的GC器 Java9在2017年九月发布 G1 Garbage First 垃圾回收器 成为 HotSpot 虚拟机默认的垃圾回收器
  • 还没用熟 TypeScript 社区已经开始抛弃了

    前端Q 我是winty 专注分享前端知识和各类前端资源 乐于分享各种有趣的事 关注我 一起做个有趣的人 公众号 点击上方 前端Q 关注公众号 回复加群 加入前端Q技术交流群 根据 rich harris talks sveltekit an