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

2020-04-09 23:05:40 +08:00
 fancy2020

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

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

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

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

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

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

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

对于一坨屎来说,不管捏成什么形状,它始终都是一坨屎💩
g00001
2020-04-10 12:32:22 +08:00
@menyakun 你说的有道理,但百分百完美提示 - 就算 C++也做不到,即使 TypeScript 也会出现推导不出来的时候,够用就好。JS 现在也可以用 *.d.ts 来配置智能提示,无奈是一百个人一百种写法, 用 JS 做一个稍有规模的项目,用到的库大多数是第三方的,难以统一规范,或强迫大家都配置好智能提示,我指的是有 “一个庞大且规范统一的标准库” 的语言能一定程度避免这个问题。
menyakun
2020-04-10 12:52:39 +08:00
@g00001 C++所谓的推导不出来,只是 IDE 在性能上设置的人为限制,静态语言的特性决定了一定可以推导出来,要不然编译器就没法工作了
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
2020-04-10 13:51:22 +08:00
@no1xsyzy 实际上我不觉得有真正的动态。所有动态的对象,背后都是一系列静态的接口、约定、协议什么的。
zhihuzeye
2020-04-10 13:55:39 +08:00
好代码加 TS 锦上添花,坏代码加 TS 雪上加霜。
对于一个项目而言,文档和测试比 TS 更重要。现况是,很多人连文档都不写,却在说 TS 能让你的代码更回规范。摊手
no1xsyzy
2020-04-10 14:00:33 +08:00
@augustheart #113 动态不是这个意思。
就好像说爱情背后都是荷尔蒙和神经的运作,并不是说不存在爱情。
就好像说船的背后都是零件、传动装置、机械结构在运作,并不是说它不是船。
整个世界的力只有强相互作用、弱相互作用、引力、电磁力四种。

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

信 ts 的类型反而容易犯错。。。毕竟真跑着的还是 js (就懒得吐槽人的问题了),相比之下还是更喜欢 java 这种。
augustheart
2020-04-10 14:06:21 +08:00
@no1xsyzy 确实,你这个解释更精准。
因为我个人原因,我对语言方面在语义方面的理解比较混乱。实现经常影响我对语义的理解。
chenmobuys
2020-04-10 14:10:44 +08:00
确实很累,感觉写了一堆无用代码,实际运行的还是 JS
Resource
2020-04-10 14:10:48 +08:00
与前面有些人的观点类似,跟 ts 无关,要是写的烂,啥语言都是丑的
maomaomao001
2020-04-10 14:17:08 +08:00
@shyling 比较好奇 , 有没有具体的代码段 , 想看看 , 因为 我用 typescript 用了很久了,99% 的情况下很顺畅,1 % 的情况,有时候可能就 any 过去了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX