0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么你根本学不下去TypeScript?

马哥Linux运维 来源:稀土掘金 作者:一介4188 2023-08-11 10:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

在群里看到一些问题和言论:为什么你们这么喜欢“类型体操”?为什么我根本学不下去 TypeScript?我最讨厌那些做类型体操的了;为什么我学了没过多久马上又忘了?

有感于这些问题,我想从最简单的一个角度来切入介绍一下 TypeScript,并向大家介绍并不是只要是个类型运算就是体操。并在文中介绍一种基本思想作为你使用类型系统的基本指引。

引子

我将从一个相对简单的 API 的设计过程中阐述关于类型的故事。在这里我们可以假设我们现在是一个工具的开发者,然后我们需要设计一个 API 用于从对象中拿取指定的一些 key 作为一个新的对象返回给外面使用。

垃圾 TypeScript

一个人说:我才不用什么破类型,我写代码就是要没有类型,我就是要随心所欲的写。然后写下了这段代码。

declarefunctionpick(target:any,...keys:any):any

他的用户默默的写下了这段代码:

pick(undefined,'a',1).b

写完运行,发现问题大条了,控制台一堆报错,接口数据也提交不上去了,怎么办呢?

刚学 TypeScript

一个人说:稍微检查一下传入类型就好了,别让人给我乱传参数就行。

declarefunctionpick(target:Record,...keys:string[]):unknown

很好,上面的问题便不复存在了,API 也是基本可用的了。但是!当对象复杂的时候,以及字段并不是短单词长度的时候就会发现了一个没解决的问题。

pick({abcdefghijkl:'123'},'abcdefghikjl')

从肉眼角度上,我们很难发现这前后的不一致,所以我们为什么要让调用方的用户自己去 check 自己的字段有没有写对呢?

不就 TypeScript

一个人说:这还不简单,用个泛型加 keyof 不就行了。

declarefunctionpick<
  T extends Record
>(target:T,...keys:(keyofT)[]):unknown

我们又进一步解决的上面的问题,但是!还是有着相似的问题,虽然我们不用检查 keys 是不是传入的是一个正确的值了,但是我们实际上对返回的值也存在一个类似的问题。

pick({abcdefghijkl:'123'},'abcdefghijkl').abcdefghikjl

一点小小的拓展

在这里我们看起来似乎是一个很简单的功能,但实际上蕴含着一个比较重要的信息。

为什么我们之前的方式都拿不到用户传入进来的类型信息呢?是有原因的,当我们设计的 API 的时候,前面的角度是从,如何校验类型方向进行的思考。

而这里是尝试去通过约定好的一种规则,通过 TypeScript 的隐式类型推断获得到传入的类型,再通过约定的规则转化出一种新的类型约束来对用户的输入进行限制。

算算 TypeScript

一个人说:好办,算出来一个新的类型就好了。

declarefunctionpick<
  T extends Record,
KeysextendskeyofT
>(target:T,...keys:Keys[]):{
[KinKeys]:T[K]
}

到这里已经是对类型的作用有了基础的了解了,能写出来符合开发者所能接受的类型相对友好的代码了。我们可以再来思考一些更特殊的情况:

//输入了重复的key
pick({a:''},'a','a')

完美 TypeScript

到这里,我们便是初步开始了类型“体操”。但是在本篇里,我们不去分析它。

exporttypeL2T=[L]extends[never]
?[]
:LextendsinferLItem
?[LItem?,...L2T,LAlias>]
:never

declarefunctionpick<
  T extends Record,
KeysextendsL2T
>(target:T,...keys:Keys):Pick

constx0=pick({a:'1',b:'2'},'a')
console.log(x0.a)
//@ts-expect-error
console.log(x0.b)

constx1=pick({a:'1',b:'2'},'a','a')
//^^^^^^^^
//TS2345:Argumentoftype'["a","a"]'isnotassignabletoparameteroftype'["a"?,"b"?]|["b"?,"a"?]'.
//Type'["a","a"]'isnotassignabletotype'["a"?,"b"?]'.
//Typeatposition1insourceisnotcompatiblewithtypeatposition1intarget.
//Type'"a"'isnotassignabletotype'"b"'.

一个相对来说比较完美的 pick 函数便完成了。

总结

我们再来回到我们的标题吧,从我对大多数人的观察来说,很多的人开始来使用 TypeScript 有几种原因:

看到大佬们都在玩,所以自己也想来“玩”,然后为了过类型校验而去写

看到一些成熟的项目在使用 TypeScript ,想参与贡献,参与过程中为了让类型通过而想办法去解决类型报错

公司整体技术栈采用的是 TypeScript ,要用 TypeScript 进行业务编写,从而为了过类型检查和 review 而去解决类型问题

诸如此类的问题还有很多,我将这种都划分为「为了解决类型检查的问题」而进行的类型编程,这也是大多数人为什么非常不适应 TypeScript,甚至不喜欢他的一个原因。这其实对学习 TypeScript 并不是一个很好的思路,在这里我觉得我们需要站在设计者的角度去对类型系统进行思考。我觉得有以下几个角度:

类型检查到位

类型提示友好

类型检查严格

扩展性十足

我们如果站在这几个角度对我们的 API 进行设计,我们可以发现,开发者能够很轻松的将他们需要的代码编写出来,而尽量不用去翻阅文档,查找 example。

希望通过我的这篇分享,大家能对 TypeScript 多一些理解,并参与到生态中来,守护我们的 JavaScript。

链接:https://juejin.cn/post/7248599585751515173





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    21352
  • javascript
    +关注

    关注

    0

    文章

    525

    浏览量

    55999
  • java接口
    +关注

    关注

    0

    文章

    2

    浏览量

    1238

原文标题:为什么你非常不适应 TypeScript

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开源鸿蒙领课堂——山东·泰安站圆满举办

    2025年12月3日下午,开源鸿蒙领课堂(以下简称"领课堂")——山东泰安站于山东科技大学泰安校区圆满举办。本次领课堂以聚焦操作系统及软件领域前沿,通过技术理论与实践经验分享,推动开源鸿蒙技术
    的头像 发表于 12-05 19:13 2281次阅读
    开源鸿蒙领<b class='flag-5'>学</b>课堂——山东·泰安站圆满举办

    ARM嵌入式这样

    ,排名第二、第三、第四等等从业人员都有高质量的生活,而在排名榜单上光鲜亮丽的从业人员也未必过得大红大紫。任何行业都与机遇、环境都有关,再好的行业也有混不下去的人,再差的行业也有人闷声赚大钱。另外,时间在变
    发表于 12-04 07:48

    电抗器选不对,电费为何居高不下

    摘要电费成本居高不下,往往是电能质量差、功率因数低所致。本文从电抗器的基本原理出发,结合行业标准与典型场景,说明其如何在节能降耗中发挥作用。背景引入在多数工业企业中,由于感性负载居多,功率因数偏低
    的头像 发表于 11-15 10:51 125次阅读
    电抗器选不对,电费为何居高<b class='flag-5'>不下</b>?

    单片机的误区

    怎么使用,根本也记不住寄存器的用途。 单片机完成一个具体的功能涉及到哪些寄存器,都会有例子给出,有些单片机,生产厂家也会给出相关的子程序,只需要调用就可以。 等你把这些基础知识完以后,几乎可以完成
    发表于 11-14 07:46

    GD RV-START开发板点灯程序下载时openocd出错

    /quickstart-doc-u-gd32vf103c_start_ide_quickstart.html 执行到图7-4,Run之后就进行不下去了。前面的步骤都正常。 出错截图如下,重新退出管理员运行也是这样。 另外附上openocd的配置 系统是win8.1 请大佬们
    发表于 11-05 12:40

    linux呢?还是去研究学习单片机内核,一些很底层的东西啥的呢?

    学生阶段技术,最容易陷入的误区就是 “把课本看懂了,就觉得自己会了”。不是不用功,是很多技术的门道藏在 “动手实操” 里,没真刀真枪做过项目,根本摸不到精髓。就拿嵌入式里的传感器调试来说吧,
    的头像 发表于 10-22 11:16 223次阅读
    <b class='flag-5'>学</b>linux呢?还是去研究学习单片机内核,一些很底层的东西啥的呢?

    rt-thread studio仿真的时候控制台不停打印乱码,导致软件卡死怎么解决?

    仿真才刚开始,停到main函数入口,下面就一直打印乱码,还不换行,底下进度条已经很短了,没多久仿真就放不下去了,rt-thread studio软件直接就卡死了
    发表于 09-17 07:05

    技术资讯 I PCB设计过程中盲/埋孔使用

    前言巴掌大的板子里密密麻麻的布线,传统的通孔像早高峰上的立交桥的“大柱子”杵在那里,走线全凭运气,绕路、打结、信号互相干仗...改版改到怀疑人生,面积还死活压不下去
    的头像 发表于 07-25 16:16 2874次阅读
    技术资讯 I PCB设计过程中盲/埋孔使用

    计量之校准、溯源性和标准

    一、计量和计量工作者用于校准领域的通用名称是“计量”,根据国家计量技术规范JJF1001-2011《通用计量术语及定义》,计量定义为“实现单位统一、量值准确可靠的活动”。校准机构常称为计量实验室
    的头像 发表于 05-30 17:21 774次阅读
    计量<b class='flag-5'>学</b>之校准、溯源性和标准

    tscircuit - 电路开发的 React 范式​ 用TypeScript、React和 AI工具构建电子产品

    TypeScript、React 和 AI 工具构建电子产品。
    的头像 发表于 04-30 18:18 1201次阅读
    tscircuit - 电路开发的 React 范式​   用<b class='flag-5'>TypeScript</b>、React和 AI工具构建电子产品

    KaihongOS操作系统:ArkTS语言基础

    和特性都适用于ArkTS。ArkTS为TypeScript添加了一些特定的API和组件,以便更好地在KaihongOS上进行开发。 ArkTS基础 类和接口 在ArkTS中,可以定义类和接口
    发表于 04-23 06:31

    硬件好还是软件好?

    硬件好还是软件好? 选择学习硬件还是软件取决于个人兴趣、职业目标以及对不同工作方式的偏好。以下是两者的一些比较,帮助你做出更合适的选择。 学习硬件可以让深入了解计算机和电子设备的物理组成部分
    发表于 04-07 15:27

    ADS1248做DRDY时,DOUT/DRDY引脚低不下来为什么?

    IDAC0:0X0F;DOUT/DRDY引脚既做数据输出,又做DRDY,寄存器读写都有效,为什么做DRDY时,DOUT/DRDY引脚低不下来为什么?这样操作与DOUT/DRDY引脚只做DOUT的操作有什么不同的地方?START一直高,CS一直低,对吗?
    发表于 02-07 06:55

    AFE7070镜像调不下去怎么处理?

    gaina、gainb、phase调节有啥规律吗,手册上没这一块的说明,而且我这边镜像最大调低了-23db
    发表于 12-26 06:17

    新手怎么嵌入式?

    新手怎么嵌入式? 在科技飞速发展的今天,嵌入式技术已经渗透到我们生活的各个角落,从智能手机到智能家居,从汽车电子到医疗设备。对于新手而言,嵌入式技术就像是一座充满神秘和机遇的宝藏,等待着大家去挖掘
    发表于 12-12 10:51