V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lbllol365
V2EX  ›  程序员

一个后端 Java 仔对 TS 的复杂感受

  •  1
     
  •   lbllol365 · 2023-06-15 15:10:43 +08:00 · 7605 次点击
    这是一个创建于 558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是个后端 Java 仔,工作除了写 Java 外,还要写一些比较简单的 Vue2 ,用的 JS 。除了 Java 和 JS ,自己平时也写点 Python 和 Go 。我写 JS 和 Python 最不爽的地方是因为是动态类型语言,IDE 提示比较差(我用的正版 Jetbrains 系 IDE ,所以一直更的最新版,效果也很差),我写一个函数,参数和返回值类型都不知道是啥,习惯了强类型就很难受,这个我感觉在用各种 Python 第三方库处理数据时更明显,各个库的类型还不兼容,就报错。

    说回 TS 和 JS 。工作用 JS ,硬糊完成任务也就算了。业余写代码可得提高标准,就寻思用 TS“雅一雅”。上 Vue3 、TS 。Github 上翻人家的 TS 代码,感慨:好“雅”。等自己写起来,发现“雅”不动了。到处的 @ts-ignore ,再就是 IDE 波浪线提示,狂按 Alt+Enter 自动修改之后,卧槽?这改出个什么东西。我觉得造成这种情况,一是自己确实不是专业前端,水平不够,JS 也就个半吊子。二是可能我用 TS 上来就追求“雅”到极致,上泛型,上接口,类型体操,结果水太深,把握不住......

    56 条回复    2024-09-23 12:40:48 +08:00
    wu67
        1
    wu67  
       2023-06-15 15:20:46 +08:00
    ts 有时候确实很难顶. 当然我也是个半桶水. 但是有些时候如果不 ignore, 我还真不知道该怎么写.

    正常人写 document.createElement('canvas'), 然后 getContext('2d'), 谁能想到这玩意还能 Object is possibly 'null', 不加个 ignore 我都不会了...

    还有就是接口字段不确定, 写着写着就蛋疼了, 甚至有数据表里没数据, 跑去请求其他系统取数的, 结果取回来字段名不一样, 我.......
    Morzairty
        2
    Morzairty  
       2023-06-15 15:22:43 +08:00
    后端 Java/Go 仔路过,TS 写起来比 JS 简单呀。
    fredsunme
        3
    fredsunme  
       2023-06-15 15:27:01 +08:00
    同 java 仔 [android] 写 ts+vue3 ,感觉 ts 在我手里更像是把 js 改的更像 java 。声明形参,根据接口造 bean 等等。
    泛型本身用的就少,类型体操那种推论也是。不过不声明返回值慢慢适应了,还算能接受。
    lbllol365
        4
    lbllol365  
    OP
       2023-06-15 15:28:01 +08:00
    @wu67 害!
    @Morzairty 我觉得在“容错性”或者叫对开发者的”某种宽容度“上,JS 要比 TS”简单“。但如果习惯 TS 的规范,确实 TS 比 JS 简单
    lbllol365
        5
    lbllol365  
    OP
       2023-06-15 15:32:25 +08:00
    @fredsunme 我原来也是这么想的,特别是玩了一段时间的 Angular ,这玩意带依赖注入,还有什么 Service 之类的概念,写起来真的和 Java 后端差不多了( Spring 魔怔人🐶)。但后来感觉,和 Go 比较像.....
    Mogugugugu
        6
    Mogugugugu  
       2023-06-15 15:39:21 +08:00   ❤️ 2
    Vite + TS 再加上 Volar ,用 WebStorm 写的时候简直血压拉满、
    wangerka
        7
    wangerka  
       2023-06-15 15:39:38 +08:00
    python 也有类型系统啊,自带的 typing 包,但是貌似和 ts 一样也就做做样子,提升不了性能
    wangerka
        8
    wangerka  
       2023-06-15 15:45:14 +08:00
    ts 属于上手门槛低( anyscript ),精通的难度高(看看这个 https://juejin.cn/post/7024673107906396190
    shiny
        9
    shiny  
       2023-06-15 15:52:17 +08:00
    lbllol365
        10
    lbllol365  
    OP
       2023-06-15 15:52:51 +08:00
    @wangerka Python 的类型注解可以支持第三方库吗?我感觉那玩意也就能写写几个基本类型了。类型体操?不了不了,花式的搞不来。前些日子看了会 Rust ,也看到类型体操,看得头皮发麻
    ChrisFreeMan
        11
    ChrisFreeMan  
       2023-06-15 16:01:43 +08:00
    建议雅到底,tsconfig strict: true 开启
    wangerka
        12
    wangerka  
       2023-06-15 16:02:00 +08:00
    @lbllol365 看那个第三方库有没有 typing 了,和 js 库有没有 index.d.ts 一样。我印象中写 pyqt5 就有类型注解
    lbllol365
        13
    lbllol365  
    OP
       2023-06-15 16:05:52 +08:00
    @shiny 感觉不错,但是后面章节要收费,先看看学习下,感谢分享
    @ChrisFreeMan 嘿嘿嘿,你别说,我当时因为这个 tsconfig strict: true 踩过坑,所以后面我写项目上来就把这玩意关了
    @wangerka 哦哦,这样啊,了解了
    ganbuliao
        14
    ganbuliao  
       2023-06-15 16:15:03 +08:00
    emmm ignore
    https://marketplace.visualstudio.com/items?itemName=genieai.chatgpt-vscode
    这个给的一些报错的建议和修改的建议还不错
    wusheng0
        15
    wusheng0  
       2023-06-15 16:45:12 +08:00
    TS 类型应该比 Java 简单吧,可能是不太适应。
    那个检查是 ESLint 检查?可以关掉一些规则。
    locochen
        16
    locochen  
       2023-06-15 16:50:38 +08:00
    ```ts
    type ....
    ```
    写多了, 容易脑袋涨
    darkengine
        17
    darkengine  
       2023-06-15 16:51:26 +08:00
    interface 一把梭的路过
    shyx
        18
    shyx  
       2023-06-15 17:02:36 +08:00 via Android   ❤️ 5
    虚假的 ts 支持: vue
    真正的 ts 支持: angular [strict: true]
    vue 对 ts 的支持浮于表面,一旦你想较真,你会发现处处受限
    lbllol365
        19
    lbllol365  
    OP
       2023-06-15 17:03:33 +08:00
    @ganbuliao 账号不好搞啊,去微软看看吧
    @wusheng0 ESLint: disable 🐶
    lbllol365
        20
    lbllol365  
    OP
       2023-06-15 17:08:01 +08:00
    @shyx 确实有那么一点感觉。但我不是专业前端,用得比较浅,就也还行吧...
    thinkershare
        21
    thinkershare  
       2023-06-15 18:39:23 +08:00
    @wusheng0 Java 的类型才是简单静态的。TS 的类型太灵活,而且 TS 支持了太多高级的类型运算,我感觉在所有语言中 TS 的类型计算是最变态的,已经到了快失控的边缘了,如果不是因为 TS 使用了类型擦除的模式,TS 的类型系统是不可能做成现在这样的计算模式的。
    Leviathann
        22
    Leviathann  
       2023-06-15 19:19:24 +08:00
    @shyx 对于一般的框架,是框架支持 ts
    而对于 React ,是 ts 支持他
    fgwmlhdkkkw
        23
    fgwmlhdkkkw  
       2023-06-15 22:13:14 +08:00 via Android
    python 也有 type hit 的
    hzzhzzdogee
        24
    hzzhzzdogee  
       2023-06-15 22:26:53 +08:00
    ts 类型系统可是图灵完备的, 能直接编程的[doge]
    kingjpa
        25
    kingjpa  
       2023-06-15 22:45:11 +08:00
    完全相反,写多了 php 和 js ,
    写静态每次都蛋疼,一个变量为什么要约定类型,自动推导不好吗? 多此一举,
    再加上 go 和 java 变量名称和类型顺序正好相反,更蛋疼了
    zhangk23
        26
    zhangk23  
       2023-06-15 22:56:57 +08:00
    技术 能用就行
    daliusu
        27
    daliusu  
       2023-06-15 23:10:49 +08:00   ❤️ 2
    @wu67 #1 ts 如果不搭配 openapi 自动生成接口,直接废了一半。你说的 Object is possibly 'null'这个问题,事实上这反倒证明了 ts 的好,因为他确实有可能是 null 的... 比如你调用一下.getContext("webgl"),然后这个对象再调用 getContext('2d') 就会返回 null ,ts 检测不出来你是不是调用过其他类型的 context 。如果你确定没有调用过其他 context ,可以使用 document.createElement('canvas').getContext('2d')!.xxx ,这种可以为 null 的在前端还挺多的,!这个符号挺重要
    daliusu
        28
    daliusu  
       2023-06-15 23:16:52 +08:00
    Vue3 其实 ts 支持也挺差的,如果你用 tsx 还好,也就是 props 和 emit 、slots 比较烂,自己封装一下也不是不能用,继续 vue 模版+ts 的话简直是要死人
    chuck1in
        29
    chuck1in  
       2023-06-16 06:51:10 +08:00 via iPhone
    @daliusu 按照规范来说好像严格模式不允许用非空断言。
    liantian
        30
    liantian  
       2023-06-16 07:31:38 +08:00 via iPhone
    @wangerka python 的 type 不能改善性能,但是可以大幅改善 ide 的体验啊…
    Imindzzz
        31
    Imindzzz  
       2023-06-16 07:46:44 +08:00 via Android   ❤️ 2
    Spring 写不好:太强了,我要再加油认真学,😍😍

    前端 TS 写不好:什么垃圾玩意,看了两个小时都学不会,🤡🤡
    crackidz
        32
    crackidz  
       2023-06-16 08:17:40 +08:00
    到处 any ignore 的,你为什么不写 JS...

    要不要考虑一下 React?
    byte10
        33
    byte10  
       2023-06-16 08:28:24 +08:00
    @kingjpa 让我放弃学习 go 的很大的原因就是类型和变量名相反,mad ,跟常用的语言都相反,这坑爹的设计,气死人了。。。

    其实我更喜欢写 JS 多一些,加上 eslint 完全没问题,基本没用过代码调试,一把梭就搞定了。虽然开发效率高,但是维护性差一些,不过偏向过程化编程都差不多,如果你用 TS 最好 往 面向对象编程的风格好一些,开发起来复用性高一些。
    secondwtq
        34
    secondwtq  
       2023-06-16 08:47:10 +08:00
    感受:楼主的描述与我的刻板印象相冲突

    一般来说,前端才是喜欢折腾“雅”的,后端就喜欢硬糊
    lbllol365
        35
    lbllol365  
    OP
       2023-06-16 09:02:48 +08:00
    @kingjpa 发动魔法卡“融合”!🐶
    @zhangk23 就是!
    @Imindzzz 毕竟我是个后端,Spring 写好了,面试唬住面试官,要 50k🐶。我可没说 TS 的不好,我只是初学,不太适应🐶
    @crackidz 几乎没有用 any ,ignore 有不少,这些是因为对 TS 的一些语法不熟,没办法。用 TS 就是为了用类型这一套
    @secondwtq 你都说“刻板印象“了🐶。其实我是全栈(干)的啦
    toesbieya
        36
    toesbieya  
       2023-06-16 09:06:45 +08:00   ❤️ 1
    ts 用起来有点像自己给自己写语法提示,没必要追求完美处处都是强类型,java 不也一堆需要强转
    AyaseEri
        37
    AyaseEri  
       2023-06-16 09:12:08 +08:00
    @wu67 possibly null 一般不是直接一个 if 判断存不存在就过了么
    godleon
        38
    godleon  
       2023-06-16 09:25:19 +08:00
    同样后端 Java, 之前也是一直写 js +vue2/3 ,但是后来用 cocos 写了个小游戏的时候,用 ts 写脚本,就感觉 ts 的编码跟 Java 更像,写出来代码比 js 更好读懂(对于 Java 来讲),其实我真的绝对 css 对后端来讲才是一大砍~
    lbllol365
        39
    lbllol365  
    OP
       2023-06-16 09:31:06 +08:00
    @godleon 哈哈哈,css ,确实,不过可以试试 Tailwind css
    Masoud2023
        40
    Masoud2023  
       2023-06-16 09:38:47 +08:00
    Any 、Object 、?,他们永远是我们的好朋友🤣
    Masoud2023
        41
    Masoud2023  
       2023-06-16 09:39:55 +08:00
    还有 @SuppressWarnings("rawtypes")
    bojackhorseman
        42
    bojackhorseman  
       2023-06-16 10:01:35 +08:00
    @wu67
    const myCanvas = document.createElement('canvas')!
    const ctx = myCanvas.getContext('2d')!

    活用非空断言,前提是你确定结果真的不会是 null
    uni
        43
    uni  
       2023-06-16 10:12:58 +08:00
    哈哈哈,说一个另类的道路,去尝试一下纯函数式编程( Haskell 那种),然后写业务的时候思考下用函数式会怎么写,这样多思考会对类型系统的理解更深刻些(什么代数数据类型之类的写着写着就很自然了,不然很多东西只是流于表面不知道怎么去思考这个问题自然地得到正确的结果
    t783072156
        44
    t783072156  
       2023-06-16 10:19:14 +08:00
    ts 还能比 java 的类型复杂。。真的假的
    lbllol365
        45
    lbllol365  
    OP
       2023-06-16 10:30:51 +08:00
    @uni 去年看《七周七并发模型》这本书,讲到 Erlang 的 Actor 模式,看得我热血沸腾,”这我不分分钟手搓一个 RabbitMQ“🐶。然后配好了 Elixir 环境,找了书教程开始看,一上手写人傻了,我是菜鸡。后面还折腾过 Clojure ,但是都因为学习的优先级太低最后不了了之了,不过还是很想好好看看 Erlang 和 Clojure 这种函数式语言的,有空再说吧。
    Leviathann
        46
    Leviathann  
       2023-06-16 10:32:04 +08:00
    @t783072156 typescript 可以用类型系统本身写 lisp 解释器
    MEIerer
        47
    MEIerer  
       2023-06-16 11:00:47 +08:00
    ts 为了兼容 js 的动态性,肯定复杂
    vone
        48
    vone  
       2023-06-16 11:42:15 +08:00
    你太客气了,TypeScript 用到业务代码里就是狗屎。
    wowawesome
        49
    wowawesome  
       2023-06-16 14:14:15 +08:00
    还是 js 吧,有一个能跑就行
    yueye115
        50
    yueye115  
       2023-06-16 15:17:44 +08:00
    哈哈, 专门写动态语言的, 表示 ts 很难受, 时间基本都花在定义类型上. 不过定义完了, 写的还是很爽
    Terry05
        51
    Terry05  
       2023-06-16 15:48:42 +08:00
    雅到极致不风流,还是脱了裤子唱昆曲吧
    Ficelle
        52
    Ficelle  
       2023-06-16 16:00:58 +08:00
    弱类型就这个样子。
    HaroldFinchNYC
        53
    HaroldFinchNYC  
       2023-06-16 23:59:56 +08:00
    说明你用的 vue3 不行
    这事不赖 tyepescript
    pkupyx
        54
    pkupyx  
       2023-06-17 02:27:30 +08:00
    tsconfig strict=false
    lizy0329
        55
    lizy0329  
       93 天前
    @wu67 有些低版本浏览器不支持 Context2D ,Typescript 为了你写出的代码能够强壮点,也是费尽心思啊
    lizy0329
        56
    lizy0329  
       93 天前
    @vone 怎么可能,现在基本是个项目都会用 Ts 限制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5680 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.