V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waiterlin989898
V2EX  ›  程序员

真的有人在项目中进行 TS 类型体操吗?

  •  
  •   waiterlin989898 · 2022-04-20 17:28:40 +08:00 · 7391 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为发现自己的 TS 一直是半桶水的水平,所以想通过看一些开源的项目,看看有没有好借鉴的代码,但在 github 上翻了几个 TS 的项目,发现基本上都是 70%的正常的 JS 书写,即使有,也基本没有全面覆盖类型推断,而 TS 类型体操更是寥寥无几,但关于 TS 的话题,在前端却异常的火爆。可能是我查询的项目有问题,有没有 V 友能提供几个相关 TS 覆盖率比较全的项目,十分感谢。

    第 1 条附言  ·  2022-04-21 17:01:48 +08:00
    首先感谢一些楼里的 V 友们提供的各个项目的链接,我基本也都点进去粗略看了一眼,其中符合我想说的类型体操的,以这个楼主 @Leviathann 发的 github 为代表,因为我着手改造的就是 ng 项目,但发现大类的 any 以及无类型的代码书写,楼层中 @kensoz 这位楼主的想法和我大致是一样的,因为本意是提升一下自己对 TS 的理解与使用,所以也尽可能的不想 any 一把梭哈,最后还是感谢热情的 V 友们的帮助。
    49 条回复    2022-04-24 18:22:54 +08:00
    wobuhuicode
        1
    wobuhuicode  
       2022-04-20 17:37:30 +08:00   ❤️ 6
    随着项目增大和更多人进来,后面的类型都会变成 any
    Oktfolio
        2
    Oktfolio  
       2022-04-20 17:41:23 +08:00
    Angular 的项目 TS 用得应该都不差的
    Chad0000
        3
    Chad0000  
       2022-04-20 17:46:06 +08:00
    看来 OP 没写过 Angular ?自从 AngularJS 升级到 Angular 后项目就都转 TS 了。
    ChefIsAwesome
        4
    ChefIsAwesome  
       2022-04-20 17:47:55 +08:00 via Android   ❤️ 1
    看到很多人花时间研究某个类型怎么推导出来,我感觉本末倒置,难以理解。
    我觉得最终的 API 能有类型,好让编辑器可以提示就够了。可能是因为我从来不写什么 class 之类的东西,所以才有这种想法。
    DoubleKing
        5
    DoubleKing  
       2022-04-20 17:48:14 +08:00
    同求
    sjhhjx0122
        6
    sjhhjx0122  
       2022-04-20 18:07:16 +08:00
    ng 只能 ts 写,所以随便找个 ng 项目都是 ts 的,vue3 也是 ts 写的
    golangLover
        7
    golangLover  
       2022-04-20 18:10:28 +08:00 via Android
    禁止 any 就好
    seakingii
        8
    seakingii  
       2022-04-20 18:14:16 +08:00
    typescript 的类型系统,搞得我怀疑人生
    nzbin
        9
    nzbin  
       2022-04-20 19:42:37 +08:00
    这个简单,直接搜 angular ,几乎都是 ts ,而且质量都很高
    wunonglin
        10
    wunonglin  
       2022-04-20 19:44:19 +08:00
    我就是看 ng 源码学 ts 的,质量很高
    ruoxie
        11
    ruoxie  
       2022-04-20 22:07:01 +08:00
    写了两年 TS 了,问下 TS 类型体操是什么东西。https://github.com/lowcoding/lowcode-vscode vue ,react ,node 都有
    Leviathann
        12
    Leviathann  
       2022-04-20 22:09:36 +08:00
    @ruoxie 比如用 ts 的类型写一个 lisp 的解释器
    Leviathann
        13
    Leviathann  
       2022-04-20 22:16:00 +08:00
    @ruoxie 偏实用方向的话,比如 lodash 的 get 函数,其实可以做到完全的类型安全
    https://github.com/sindresorhus/type-fest/blob/main/source/get.d.ts
    XCFOX
        14
    XCFOX  
       2022-04-20 22:30:17 +08:00
    我见过类型体操最 6 的项目:
    https://github.com/codemix/ts-sql
    cszchen
        15
    cszchen  
       2022-04-20 22:31:32 +08:00 via iPhone
    我觉得 ts 写起来很舒服啊,赶时间的时候蛋疼。
    xiangwan
        16
    xiangwan  
       2022-04-20 22:33:28 +08:00
    enchilada2020
        17
    enchilada2020  
       2022-04-20 22:40:11 +08:00 via Android
    @xiangwan 这个就是操场 233 不是实际项目
    magicdawn
        18
    magicdawn  
       2022-04-20 22:40:24 +08:00
    dcsuibian
        19
    dcsuibian  
       2022-04-20 22:42:01 +08:00
    @ruoxie 估计就是类型推测,推测( tc )= 体操( tc )。我也想了一会儿
    Loserzhu
        20
    Loserzhu  
       2022-04-20 22:44:59 +08:00
    大一点的项目不用 ts 根本不会写。简历各个写熟练 ts ,随便问个如:用其他 type uitls 实现 Omit ,至少一半的都没听过 Omit Pick Exclude 这些。
    Rocketer
        21
    Rocketer  
       2022-04-20 22:57:18 +08:00 via iPhone
    @Loserzhu Java 转过来的人一般喜欢 TS ,就是因为它更像 Java ,写着舒服。但他们也不会因此而去研究 TS 的特性,像写 Java 一样写 TS 才是他们想要的,也是 TS 的最大价值所在。

    前端圈之所以讨论热烈,是因为 type 对他们来说是个新鲜事物,既麻烦又有用,难免会争论。但后端谁会有兴趣讨论这低一档的玩意?

    但你这个做法是在考别人 TS 特有的东西,舍本逐末了。
    enchilada2020
        22
    enchilada2020  
       2022-04-20 23:07:25 +08:00 via Android
    @Leviathann 这个在知乎上也看到过相关文章 不会就是你写的吧:)
    chihiro2014
        23
    chihiro2014  
       2022-04-20 23:19:05 +08:00
    最近接手的项目都是 ng 的,然后历史遗留问题,目前是 ng5 ,不少地方其实没有写类型限制

    为了方便日后推进升级,于是只能自己慢慢动手加了
    Jooooooooo
        24
    Jooooooooo  
       2022-04-20 23:32:10 +08:00
    方便的东西总是会被用上的, 所以最好的方案是禁用这种东西(机制上禁用, 而不是规范).
    tedding
        25
    tedding  
       2022-04-21 02:24:09 +08:00 via iPhone
    用了 3 年的 angular……起初也被 ts 搞的焦头烂额,现在如鱼得水,两个字,丝滑……
    debuggerx
        26
    debuggerx  
       2022-04-21 03:12:04 +08:00
    不用 ts 类型不会写+1 。
    真的还挺佩服不用类型系统还能写出代码的选手[狗头]
    musi
        27
    musi  
       2022-04-21 06:54:25 +08:00   ❤️ 2
    楼上可能搞混了类型系统和类型体操
    这两不是一个概念
    kensoz
        28
    kensoz  
       2022-04-21 08:25:18 +08:00
    学 vue3 那时候,我就想知道 ref 的类型写在哪,有没有什么最佳实践,于是就上 github 看开源项目
    90%的项目基于 Vue3 + TS 但是写法都是:let foo = ref(666)
    这种简单的类型也就算了,复杂的 dom ,bom 和对象这 90%的项目也没有加类型
    对于这 90%的项目就是把.js 改成.ts 而已
    lixm
        29
    lixm  
       2022-04-21 08:48:03 +08:00
    @kensoz ref 不是支持泛型的吗? ref<T>
    anguiao
        30
    anguiao  
       2022-04-21 09:05:17 +08:00
    @kensoz
    number 这种能推断出来的,本来就不需要写啊。静态类型不代表必须显式声明类型。
    当然了,模板引用这种情况,还是应该写上类型的。
    bam9
        31
    bam9  
       2022-04-21 09:14:25 +08:00
    @wunonglin ng 是啥?
    darkengine
        32
    darkengine  
       2022-04-21 09:21:12 +08:00
    看来我还没入门,项目里用了 TS ,但是用法是 interface 和 enum 一把梭。
    fgwmlhdkkkw
        33
    fgwmlhdkkkw  
       2022-04-21 09:23:48 +08:00
    @golangLover #7 那我就用 JSON 串😀
    pigspy
        34
    pigspy  
       2022-04-21 09:24:56 +08:00
    不用,大部分情况下完全用不到类型体操
    dvsilch
        35
    dvsilch  
       2022-04-21 09:27:49 +08:00
    类型体操不是指各种花哨方式去实现一些偏门的类型推测吗。。。难道我理解错了?
    christin
        36
    christin  
       2022-04-21 09:36:41 +08:00 via iPhone
    刚开始写 ts ,不到 100 行的代码出了一大堆错误。
    kensoz
        37
    kensoz  
       2022-04-21 09:51:24 +08:00
    @anguiao 没错,我想表达的就是很多开源项目根本没有类型声明,跟别提类型体操了,就是单纯的改.js 为.ts
    kensoz
        38
    kensoz  
       2022-04-21 09:53:08 +08:00
    @lixm 有的,这都是简单的,一些稍微复杂一点的地方比如 axios 的返回值和错误的类型,基本再开源项目里都没有见到过
    icyalala
        39
    icyalala  
       2022-04-21 10:09:36 +08:00
    所以类型体操到底是什么
    Torpedo
        40
    Torpedo  
       2022-04-21 10:31:43 +08:00
    不同人对体操的水平定义不太一样。不知道楼主体操的定义复杂度是多少
    不过,普通的开发水平,看 ts 定义,直接看官方的 https://github.com/microsoft/TypeScript/blob/main/lib/lib.dom.d.ts ,在里面找一些常见的 api ,看看他们 ts 类型就明白了
    Jsonz
        41
    Jsonz  
       2022-04-21 10:34:37 +08:00
    antDesign ReactTable
    mikulch
        42
    mikulch  
       2022-04-21 10:36:57 +08:00
    @Rocketer 写 java 的人怕不太喜欢 ts 哦。ts 的类型比 java 还要复杂,设计思路都不一样。
    mmmfj
        43
    mmmfj  
       2022-04-21 12:31:18 +08:00
    开源库会用,项目用不到
    equt
        44
    equt  
       2022-04-21 12:49:08 +08:00 via iPhone
    fp-ts ,或者说一众 FP 库,可以看一下。基本是抄了当年 OCaml 的操作,用 Module System 模拟 HKT ,然后把一些常见的代数结构搬进了 TS 。

    其实热门一些的项目可以看看 Vue 3 的几个编译时宏是怎么定义的;官方的几个新的类型,比如递归的 Awaited 是怎么随着 tsc 一步步优化进标准库的;官方的 Blog 也值得看看,尤其注意几个重要的时间节点,比如 Template String Literal 、递归类型。

    最后试着实现简单的运行时 pick 、rename 、omit 这种工具函数,困难的可以试试 encoding 和 decoding ,参考 zod 或者 io-ts ,看看后者怎么把 Lens 搬到 TS 里。

    P.S. 上面几个库的衍生品也很有意思
    justin2018
        45
    justin2018  
       2022-04-21 13:53:37 +08:00
    TS 类型体操 感觉好复杂 但是有套路 要是在复杂 我没也搞不定了~~

    这个小册内容还不错 可以看看 非作者~~ 非推广~~
    TypeScript 类型体操通关秘籍
    https://juejin.cn/book/7047524421182947366
    jin5354
        46
    jin5354  
       2022-04-21 14:34:47 +08:00
    实际开发中写 ts 写着写着写不下去了没太多必要纠结,直接 any ,as 什么的用起来。
    因为 ts 开发了这么多年还是个弱智,太多的类型收窄什么的不懂自动识别,写着费劲死
    keyrinrin
        47
    keyrinrin  
       2022-04-21 14:36:06 +08:00
    简单用用是挺好用,但看到其它项目一堆泛型秀操作,感觉更繁杂了
    chuanqirenwu
        48
    chuanqirenwu  
       2022-04-21 17:20:19 +08:00
    弱弱问一下,什么是类型体操?
    KaGaMiKun
        49
    KaGaMiKun  
       2022-04-24 18:22:54 +08:00
    想起了我这边之前 vue 有人设计的组件直接 any
    但用得地方又很有限,有些地方没法重用,但打包就是没问题,一跑就红
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1033 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:30 · PVG 06:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.