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

没人觉得 TS 的代码非常丑吗..

  •  
  •   fancy2020 ·
    fanchangyong · 2020-04-09 23:05:40 +08:00 · 18395 次点击
    这是一个创建于 1476 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我个人非常讨厌 TS,奈何现在很多第三方库都在使用 TS 了,所以也不得不接触,平时看代码的时候看到一坨坨冗长的类型定义,真的看得非常累..

    第 1 条附言  ·  2020-04-10 10:00:14 +08:00
    164 条回复    2020-04-14 19:11:25 +08:00
    1  2  
    oahebky
        101
    oahebky  
       2020-04-10 11:33:50 +08:00
    @jarenduan #91 原文:“@oahebky - 不论是内置的不同类型还是自己新建类型,只要实现了迭代,就可以被迭代的关键字语法或函数迭代地调用。- 只要实现了字典操作 _dict['key'],那么不论是内置类型还是自己新建类型,都可以这么用。C# foreach 实现方式类似, 索引属性也类似. C#是静态类型语言. 这些特性和是否动态类型没有关系.动态类型不等于弱类型, 通常指在运行时进行类型检查, 它也是基于类型的. 所以不存在动态类型语言是基于"行为"的这种说法.运行时检查的最大问题是没有编译器帮你事前发现潜在 bug. IDE 也没办法给你智能提示. 你拿到新类库以后, 也不知道调用什么, 返回什么, 属性方法怎么拼写, 必须强度依赖文档. 重构实现也非常难或者效率低. 这更多程度是软件工程范畴的问题. 搞过 C++的这些应该深有体会啊.”
    ======
    回复:

    我没写过 C#,当然也没用过 foreach,不过是否你说的 C# 的 foreach 方式有种给静态语言在编译器里面加了个前置判断变量是否支持遍历的感觉?


    你们回复我都搞错了一个点,我没有否认动态语言在软件工程上的问题,我一开就说了语言要发展。
    但我说的发展不是语言语法,在语法上不断加料,好一点的是对于当下能力的 workround,坏的就是走歪路。
    语言的发展当然是往编译器的能力上发展 -- 比如说动态语言编译器能自动(后台)做到变量的覆盖测试(给予 warning 和 error )。
    动态语言编译器能自动(后台)做到变量的覆盖测试和异常条件覆盖测试都是我期望未来语言发展的方向,就看你敢想不敢想了。

    动态类型的 IDE 也是可以智能提示的,如果没有就说明说这个语言还没发展到那一步。
    852228187
        102
    852228187  
       2020-04-10 11:34:38 +08:00
    你肯定没用过 js,大型项目里面全是闭包,用 vscode 智能提示很弱,现在公司这个老项目,调用函数 全靠记忆- -
    menyakun
        103
    menyakun  
       2020-04-10 11:36:09 +08:00
    @g00001 我没用过 aardio,但我按照 js 和 python 这种动态语言的特性来类推,如图的例子在`store.user[1].post`之前添加一个赋值语句,根据某个运行时才知道的值,修改 user 对象的 post 方法,那么不管 IDE 怎么做,也不可能做到智能提示。所以这和“有一个庞大且规范统一的标准库”没有关系,一门语言也不可能强制所有人都只使用标准库。
    no1xsyzy
        104
    no1xsyzy  
       2020-04-10 11:43:28 +08:00
    @cmdOptionKana #55 现代 IDE 应该能够在极端动态的情况下正确推断类型
    Python,我曾为了少写点字,写出来些伪动态构造的类(即是指,它其实是写死的每次构造出必然相同的类,即类工厂,固定参数调用),结果 pylint 彻底不工作了,整个项目无法推断类型,迫使我换用 PyCharm,就很正常。
    实际上,在现代 IDE 的支持下,写动态都是近似类型安全的。
    mydearxym
        105
    mydearxym  
       2020-04-10 11:43:41 +08:00
    某种角度上 TS 和所谓的原型设计工具类似,它们解决的都是协作的问题,对于独立开发乃至小团队而言,它们都不是必须的,有些时候反而造成很多不必要的麻烦。
    oahebky
        106
    oahebky  
       2020-04-10 11:47:50 +08:00 via Android
    @augustheart
    确实如此。个人感觉软件工程师理解到这一点也可以了。

    当然,这是个人感觉和判断。

    但是多数软件工程师无法理解(没有机会理解)动态语言的类型工厂能力(包括我自己)。
    我知道动态语言有个类型工厂的能力,我还没有完全理解,但是我对此做出一个这将会是未来“动态语言攻城略地的核心能力”的判断。
    所以,基于这个判断我会坚持发展动态语言才是真正的进步的思路。
    jarenduan
        107
    jarenduan  
       2020-04-10 12:04:07 +08:00
    @oahebky 纯交流啊. 动态语言 /动态类型语言 /解释型语言意义上有差别, 最好不要混起来说. 如果说动态类型语言的话, 就是说类型检查在运行时进行, 一般来说都是解释型语言, 没有编译器的.

    不靠格式化的注释 /文档, 就依赖代码本身中的信息进行智能提示, 那必须在运行时之前就要进行代码分析, 当然分析的简单点, 就分析一下语法和规范, 那就相当于是 jslint, 分析的彻底点, 进行一些语义检查, 包括控制流和类型静态检查, 这就相当于 TS, 代价就是要给编译器提供一些必要的信息.

    TS 在语法上面的改进, 完全是为了后台进行分析提供必要的代码信息, 是为了增强 js 开发时的代码分析能力, 提升开发效率与消除一些不必要的问题. 不提供这些信息, 编译器或者分析器是无法完成工作的, 是永远达不到你说的那一步的.
    jarenduan
        108
    jarenduan  
       2020-04-10 12:05:53 +08:00
    @menyakun 我看了一下, 他的智能提示是靠格式化的注释完成的...
    tikazyq
        109
    tikazyq  
       2020-04-10 12:06:09 +08:00   ❤️ 1
    用纯 js 写过大型程序之后,才会明白写 ts 有多么香。

    当然这也跟代码风格有关,如果本身写代码写得很烂,用啥语言都丑

    对于一坨屎来说,不管捏成什么形状,它始终都是一坨屎💩
    g00001
        110
    g00001  
       2020-04-10 12:32:22 +08:00
    @menyakun 你说的有道理,但百分百完美提示 - 就算 C++也做不到,即使 TypeScript 也会出现推导不出来的时候,够用就好。JS 现在也可以用 *.d.ts 来配置智能提示,无奈是一百个人一百种写法, 用 JS 做一个稍有规模的项目,用到的库大多数是第三方的,难以统一规范,或强迫大家都配置好智能提示,我指的是有 “一个庞大且规范统一的标准库” 的语言能一定程度避免这个问题。
    menyakun
        111
    menyakun  
       2020-04-10 12:52:39 +08:00
    @g00001 C++所谓的推导不出来,只是 IDE 在性能上设置的人为限制,静态语言的特性决定了一定可以推导出来,要不然编译器就没法工作了
    no1xsyzy
        112
    no1xsyzy  
       2020-04-10 12:55:47 +08:00
    话说讨论类型先区分以下几组概念吧:
    隐式类型 vs 显式类型
    强类型 vs 弱类型
    动态类型 vs 静态类型

    隐式和动态常常混淆,但是 Haskell 是隐式静态(充分的类型推导)…… Python with Type Annotation 是显式动态(相当于文档)

    但实际上这些都在融合
    原本隐式类型的 Python 和 Scheme 出现了 Type Annotation 和 Typed Racket 这种,原本显式的 C++ 也提供 auto 来一定程度上隐去冗长的定义而放给推导。
    Python 的魔法方法提供了非严格强,JavaScript === 比较符提供了部分强。
    Java 泛型的实现实质是动态类型,而 RPython (就是 pypy 的限制)和 TS 则开始要求静态。
    augustheart
        113
    augustheart  
       2020-04-10 13:51:22 +08:00
    @no1xsyzy 实际上我不觉得有真正的动态。所有动态的对象,背后都是一系列静态的接口、约定、协议什么的。
    zhihuzeye
        114
    zhihuzeye  
       2020-04-10 13:55:39 +08:00 via iPhone
    好代码加 TS 锦上添花,坏代码加 TS 雪上加霜。
    对于一个项目而言,文档和测试比 TS 更重要。现况是,很多人连文档都不写,却在说 TS 能让你的代码更回规范。摊手
    no1xsyzy
        115
    no1xsyzy  
       2020-04-10 14:00:33 +08:00
    @augustheart #113 动态不是这个意思。
    就好像说爱情背后都是荷尔蒙和神经的运作,并不是说不存在爱情。
    就好像说船的背后都是零件、传动装置、机械结构在运作,并不是说它不是船。
    整个世界的力只有强相互作用、弱相互作用、引力、电磁力四种。

    动态很多人提到它几乎都是解释型的。原因就是实际上是在用元数据来表达类型。First-class Type 就是指这个,你可以把类型绑定到变量上,因为它本质就是些数据,这点 lisp 是极端,“程序即数据”。宏的存在导致程序本身都是不确定的。
    shyling
        116
    shyling  
       2020-04-10 14:05:16 +08:00
    之前用过几个 ts 写的库。。生成的 d.ts 没完全正确的。。。可能适合 OO 教吧,反正个人比较无感。

    信 ts 的类型反而容易犯错。。。毕竟真跑着的还是 js (就懒得吐槽人的问题了),相比之下还是更喜欢 java 这种。
    augustheart
        117
    augustheart  
       2020-04-10 14:06:21 +08:00
    @no1xsyzy 确实,你这个解释更精准。
    因为我个人原因,我对语言方面在语义方面的理解比较混乱。实现经常影响我对语义的理解。
    chenmobuys
        118
    chenmobuys  
       2020-04-10 14:10:44 +08:00   ❤️ 1
    确实很累,感觉写了一堆无用代码,实际运行的还是 JS
    Resource
        119
    Resource  
       2020-04-10 14:10:48 +08:00
    与前面有些人的观点类似,跟 ts 无关,要是写的烂,啥语言都是丑的
    maomaomao001
        120
    maomaomao001  
       2020-04-10 14:17:08 +08:00
    @shyling 比较好奇 , 有没有具体的代码段 , 想看看 , 因为 我用 typescript 用了很久了,99% 的情况下很顺畅,1 % 的情况,有时候可能就 any 过去了
    alexmy
        121
    alexmy  
       2020-04-10 14:25:44 +08:00
    遇到别人写的 js,又杂又乱又长,也是想死的心都有了,同名的函数又一堆,真想原地爆炸。
    g00001
        122
    g00001  
       2020-04-10 14:35:10 +08:00
    @menyakun C++开发环境推导智能提示与编译并不等价,即强大的 VC++开发环境早期大家都是关掉官方的装第三方智能提示插件,有时候甚至是 IDE 整个崩溃 - IDE 不太可能人为去设置这种限制或者让大家崩溃。
    Vedar
        123
    Vedar  
       2020-04-10 14:39:42 +08:00   ❤️ 1
    ts 丑的原因 大部分还是因为要兼容 js 的锅
    htoooth
        124
    htoooth  
       2020-04-10 14:52:24 +08:00
    JavaScript 的动态类型,造成了 ts 的类型的复杂
    labulaka521
        125
    labulaka521  
       2020-04-10 14:58:25 +08:00 via Android
    以前在哪看过一个 ts 吹,应该叫过来和你对线下
    grewer
        126
    grewer  
       2020-04-10 15:11:30 +08:00
    之前有写了下 js ,写了几十行就不行了
    代码没提示,有没有方法不知道 要翻文档
    然后一个值没有定义,也没有报错
    shyling
        127
    shyling  
       2020-04-10 15:26:53 +08:00
    @maomaomao001 当时是用 https://github.com/gautamsi/ews-javascript-api 时感受很深。。。但是具体忘了哪部分了,过了太久了
    Mark24
        128
    Mark24  
       2020-04-10 15:40:17 +08:00
    *JS* 是所有人这辈子永远得不到的语言

    你以为你看懂了,第二天他就变了
    xcstream
        129
    xcstream  
       2020-04-10 15:51:02 +08:00
    因为要兼容 js 没有更好的办法
    kile
        130
    kile  
       2020-04-10 15:55:25 +08:00   ❤️ 1
    作为一个 java 和 android 开发..日常用 kotlin 和 java...

    然后去看了看 typeScript 的类型定义是有多丑...

    擦,这不是正常的吗...kotlin 一模一样...
    iugo
        131
    iugo  
       2020-04-10 16:08:57 +08:00
    附言 1 中的链接写得不怎么样. 尤其是 "The creator of Typescript knows nothing about programming" 这种愤青言论, 都不想去反驳 TA.
    jayho
        132
    jayho  
       2020-04-10 16:20:12 +08:00
    公司没有这个需求,刚刚进入 vue 时代,我有必要学 ts 嘛?哈哈
    noobcoder1
        133
    noobcoder1  
       2020-04-10 16:33:35 +08:00
    搞前要跟随潮流 大家都搞哪个 你就得搞哪个 怕麻烦 就转后端
    hmxxmh
        134
    hmxxmh  
       2020-04-10 16:46:06 +08:00
    @tikazyq 大佬,人群中你总是那么闪耀,跟着你拥抱 ts
    Encloud
        135
    Encloud  
       2020-04-10 17:02:02 +08:00   ❤️ 6
    一百多层楼没一个人看完原文的吗...原文是一篇讽刺文章,在最后一段有解释,楼主估计也就看到个标题就贴出来了
    kingwl
        136
    kingwl  
       2020-04-10 17:42:18 +08:00
    @oahebky

    > 但是编程未来是越往类型的本质靠拢的。也就是所谓的走起来像鸭子、叫起来像鸭子,那么它就是只鸭子。

    这是所谓的 structural type system 和 nominal type system 的区别,不是什么本质,也不是什么未来。
    newmlp
        137
    newmlp  
       2020-04-10 18:22:07 +08:00
    觉得丑你可以不用啊
    garfeildma
        138
    garfeildma  
       2020-04-10 19:51:59 +08:00
    @kingwl

    所谓的鸭子类型只不过是 late binding,都算不上什么 type system 😂️
    wi
        139
    wi  
       2020-04-10 20:26:10 +08:00   ❤️ 1
    C# 和 Java 不能和 TypeScript 相提并论,TypeScript 不是倾向于面向对象,安全的抽象就是要有类型,说类型不重要的根本不懂得怎么抽象代码,写起来就是动态火葬场,不考虑类型安全,垃圾程序员太多,不说了。
    kingwl
        140
    kingwl  
       2020-04-10 20:35:50 +08:00
    @garfeildma

    我不确定我们的名词是不是对的上,但是 A structural type system (or property-based type system) is a major class of type system,
    nimohe
        141
    nimohe  
       2020-04-10 21:43:30 +08:00
    没有 你是天命之子 ~
    lhc70000
        142
    lhc70000  
       2020-04-10 22:40:32 +08:00   ❤️ 2
    咦,没人看到 dev.to 那篇文章是在钓鱼?也不知道楼主 append 上去是什么意思……(
    james122333
        143
    james122333  
       2020-04-11 01:03:08 +08:00 via Android
    函数好但不喜欢 js 少类型好 类太多会崩溃
    空间才三个轴却能包含寰宇 只有必要 没有多余 古老即有的智慧
    shynome
        144
    shynome  
       2020-04-11 03:02:22 +08:00 via Android
    Typescript 的编译和其他的不一样,它是输出可读性良好的 JS 代码为目标的,所以你单独看输出的 JS 代码也是可以的
    然后为什么用 Typescript,主要是为了编辑器提示,就算你只用 JS 也可以使用 .d.ts 文件完善编辑器代码提示

    题外话:
    大量的 @types/* 库反哺了 JS 的编辑器代码提示,这些文件都是前几年 JS 代码提示很弱时 TS 使用者补上的,但是怎么补也是有可能和源代码的类型脱节的,这个时候就会想切到 TS 或者用 TS 重写了,保证编辑器的提示和实际的代码行为是一样的
    himself65
        145
    himself65  
       2020-04-11 03:38:29 +08:00 via iPhone   ❤️ 2
    不知道题主贴了个打自己脸的文章链接是要干什么…
    superbiger
        146
    superbiger  
       2020-04-11 06:51:21 +08:00
    都写过几年 C++了,当头文件写不就得了有那么纠结?!看不懂
    mmdsun
        147
    mmdsun  
       2020-04-11 09:27:51 +08:00 via Android
    去看下 Go 。Go 的语法完全看不下去了
    SASUKE
        148
    SASUKE  
       2020-04-11 09:35:45 +08:00 via Android   ❤️ 2
    当你读到 creator 那段的时候就明白文章只是嘲讽。
    It's a very bad satire to be honest, poorly executed, and is more damaging than helpful.
    nnnToTnnn
        149
    nnnToTnnn  
       2020-04-11 09:38:44 +08:00
    @fanchangyong


    ```
    最烦的就是,很多人认为讨厌 TS 的人===没用过静态类型语言的。
    本人工作 12 年,刚开始工作做过 5 年 C++游戏后端,所以我明白静态语言有哪些好处,我更明白动态语言有自己的特点,
    不喜欢一门好好的动态语言被静态化
    ```

    如果是开发前端,你有木有过,API 不自动提示,调用函数需要点击进去看源码里面写的什么。 经常出现空指针的情况?

    相对于 js 而言我其实蛮喜欢 ts 的,虽然定义,麻烦,一但定义好了,之后就很方便了。 ts 的出现也不是闲的无聊发展出来的。 [doge]
    chanchan
        150
    chanchan  
       2020-04-11 10:00:18 +08:00 via Android
    append 的文章是啥意思😆
    pkwenda
        151
    pkwenda  
       2020-04-11 12:11:11 +08:00
    @chanchan 字面意思啊
    des
        152
    des  
       2020-04-11 12:14:52 +08:00
    一开始用难受,用过一阵表示真香
    RickyC
        153
    RickyC  
       2020-04-11 12:18:31 +08:00
    TS 是不是有 import?
    对 import 有点不适应
    longjiahui
        154
    longjiahui  
       2020-04-11 12:32:41 +08:00
    你不是一个人++++++++++++++++++++++++++++++++++++
    baobao1270
        155
    baobao1270  
       2020-04-11 13:24:31 +08:00
    TS 把 JS 变成静态语言,是进步。
    但是,TS 相比于 Java,C# 这些语言,还是不够“优雅”。
    我在想,既然 TS 是要“编译”成 JS 的,为何不重新发明一种语言,而要固守 JS 的语法呢?
    但是,你看 Python 的发明者就是不满其他语言发明了 Python,在这个领域毕竟是 You can you up, show me the code 的。既然嫌一个语言不爽,为什么不发明一个语言呢?
    在这个语言过程中,就会发现很多问题,也能体会到一个语言真正的优点和不足。
    hourann
        156
    hourann  
       2020-04-11 13:30:05 +08:00 via iPhone
    @fanchangyong 虽然 C++的类型系统在我看来很难用、功能更基础,但这可能是我 C++用的比较少没有驾轻就熟的原因。在我看来类型系统至少有 3 个功能:

    1. 引入额外的语义。良好的类型系统本身可以替代一部分的文档。对于第三方的库来说,带类型注解的函数签名和把类型注解给去掉以后相比,哪种情况更容易正确使用?

    2. IDE 优化。类型系统能使得你在写函数的时候,IDE 有能力补全函数参数的成员和方法。类型系统使得你还没按下编译 /运行键,IDE 就能告诉你一些事情出错了。类型系统能在你重构的时候,给你更多的掌控。

    3. 编译器优化。这也是引入额外语义的附加效果。如果从 0 开始分别为 js 和 ts 写一个编译器 /解释器而不必考虑兼容问题,那么运行效率更快的一定不是 js 。这是显而易见的,因为 ts 能退化成 js 。这也是为什么大部分的静态类型语言比动态类型语言要快。

    前两点提高了开发效率,最后一点甚至提高了运行效率。而我们需要为此付出的:

    1. 学习额外的类型系统。现代类型系统仍在不断进化,所以你的学习不是一劳永逸的,但是掌握基本类型系统后你就可以很快的上手了。当你想要为代码赋予更精确的类型语义时,再翻翻高级类型系统的文档吧。

    2. 为类型注解付出额外的工作量。向 IDE 求助吧,这些注解不会占用你多少额外时间。甚至你能从类型即文档中节省更多的时间。
    cw2k13as
        157
    cw2k13as  
       2020-04-11 13:46:52 +08:00
    不太理解 ts 会妨碍你去阅读第三方源码,反而可以快速的去帮助你理解,还有实际开发中你不喜欢 ts 你可以不使用,并不是强制,ts 最明显带来的好处是大型项目的上线不免出现一些低级的错误,平时代码是稍微比原来麻烦一点,比起上线后一些无端的低级的错误来说,大项目是经不起这样这折腾
    cmdOptionKana
        158
    cmdOptionKana  
       2020-04-11 14:32:46 +08:00
    @baobao1270 与 TS 同期甚至更早,就有过很多语言尝试取代 JS,它们都选择了不兼容 JS 这条路,结果无一例外全部失败了,只有兼容 JS 的 TS 被业界接受。

    语言洁癖的人其实是少数,多数人只看能不能快速用起来,所以兼容非常重要。
    Perry
        159
    Perry  
       2020-04-12 00:04:55 +08:00 via iPhone
    https://dev.to/michaeljota/this-is-why-i-hate-typescript-3da0

    楼主你引用这个链接什么意思?你是不是没看完全文?这篇文章就是用来反讽楼主这类人的,看完把我笑喷了。
    fancy2020
        160
    fancy2020  
    OP
       2020-04-12 00:19:16 +08:00
    @Perry 的确没看见开头那句话,但不影响我同意文章中的某几点观点(非全部),前边已经说过了。
    文章贴出来是看里边的观点,而大部分人抓住反讽的那句话当笑话看,还以为是发现什么大新闻了
    Perry
        161
    Perry  
       2020-04-12 00:45:36 +08:00 via iPhone
    像楼主这样的人见多了,V 站喷 TS 的多了去了,大多数人不喜欢 TS 还是因为先入为主,把之后发明出来的东西视为异类,代码一冗长就像婴儿一样嗷嗷叫。一开始不喜欢之后,别人说啥也不听,也不愿意去了解别人用 TS 的原因,喷就是了。

    那篇文章的作者就是把这些奇葩喷点列举出来来反讽那些人,作者也说了喷点被夸大过,文章后面的一些评论也有人细心解释了各种喷点的不合理性,然后楼主你说你同意那些喷点?厉害了,这样的人我叫不醒,活在自己的世界里吧 🐶
    gjquoiai
        162
    gjquoiai  
       2020-04-12 16:41:20 +08:00
    这篇文章不是反讽么。。作者也说了里面的观点是一些人对 ts 看法的夸大。。
    greenlantern
        163
    greenlantern  
       2020-04-12 18:19:38 +08:00 via Android
    丑归丑,搞大东西的时候就爽了,加 feature 和单元测试都爽的一逼。。。
    RRRSSS
        164
    RRRSSS  
       2020-04-14 19:11:25 +08:00
    丑么,我感觉静态类型让我十分安心,很美,很甜。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   995 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 20:36 · PVG 04:36 · LAX 13:36 · JFK 16:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.