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

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

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

19139 次点击
所在节点   程序员  程序员
164 条回复
ironMan1995
ironMan1995
2020-04-10 10:36:32 +08:00
前些年的全网言论还是 JS 作为弱类型语言是它优点,现在又变了???
qiaobeier
qiaobeier
2020-04-10 10:38:40 +08:00
超级丑的 ts 屎山和超级乱的 js 屎山的区别。都是屎山没差啦。
Torpedo
Torpedo
2020-04-10 10:41:04 +08:00
PS:楼主贴的文章,在我见过反对使用 ts 的文章里,水平最低的一篇。。。
fancy2020
fancy2020
2020-04-10 10:42:28 +08:00
@Torpedo 哈哈,那你可以多贴几篇,给反 TS 阵营鼓鼓劲~
ironMan1995
ironMan1995
2020-04-10 10:42:55 +08:00
如果 TS 能够解决你的问题就用,很多人都受益于 TS ;如果你觉得 TS 不能带来好处,那不用也行。不要因为别人都在用你就用,不要因为这个“比较热”你就跟风去用。前端鄙视链,现在已经有用 TS 鄙视用 JS 的趋势了
augustheart
augustheart
2020-04-10 10:44:19 +08:00
@ironMan1995 这点依然是优点吧,但是你的优点不见得是别人的优点啊。
比如我写 c++的时候特别喜欢用模板,只要有可能重用算法的地方我都会写个模板,结果上次被合作的哥们给吐槽了……
语言对个人来说想怎么用就怎么用,但是如果涉及到多人合作,就得面临各种妥协了。比如谷歌的 c++规范,都妥协成什么鬼样子了……
fancy2020
fancy2020
2020-04-10 10:45:12 +08:00
@ironMan1995 如果可以做选择当然我不 Care 会出现什么 TS 还是 BS,关键 TS 的侵入性太强了,不像 Flow 等工具把类型的定义单独放,看很多第三方库代码的时候不得不读 TS 。所以会有种被强迫使用 TS 的感觉
lihongming
lihongming
2020-04-10 10:50:47 +08:00
Java 过来的我表示也不喜欢 TS,不伦不类的。

既然是另一门语言了,既然需要编译才能运行了,何不直接使用 Java ?把 Java 编译成 JavaScript 不香吗?
oahebky
oahebky
2020-04-10 10:59:01 +08:00
@cmdOptionKana #77 原文:“@oahebky 鸭子类型最大的问题在于,这只动物不走、不叫(即不动、程序不运行)的时候,你不知道它是什么动物。也就是说,静态分析难度大。就算让它走了、叫了(即,在运行时),前面运行得好好的,看起来像极了鸭子,后面偶尔有一段代码要求它拍翅膀,这才发现它虽然走起来像鸭子、叫起来像鸭子,却没有翅膀!程序抛出异常。当一个程序越来越大的时候,一个动物(类、对象)的特性就越多、越复杂,偶尔发现它不是想要的动物的情况就会很多,多到项目失控。静态语言的好处是,静态分析轻松,只要声明它是鸭子即可,它不管去到多么复杂的系统里都能一眼看出来就是鸭子,不需要它把全部动作都做一遍(程序不需要运行,直接静态分析),一边写程序一边有精确的提示,重构的时候极方便,不容易出错。”
======
回复:
我没有说静态语言完全没有好处。
我说的是“我个人坚信语言往静态发展是倒退。往动态发展是进步。”
我的意思也就是说,对于你说的动态语言问题,思路是通过进化编译器逐渐解决,也就是进步。
但是因为动态语言有这个问题,就退回到没有这个问题的静态语言上,那么静态语言要怎么进步呢?不就是泛类型化 -- 往动态性演变。“最终还是变成一个拥有动态语言(语法)的静态编译器”。

静态语言不是因为你一眼看出来是鸭子,是鸽子所以不容易出错(编译器报错)。
而是因为你把时间花在查看源码实现,以及实现给鸭子安上火箭推进器上。

而不是像动态语言一样可以“凭感觉”写,把鸭子的声线和鸭掌按倒火箭推进器上,然后把这个火箭推进器返回(鸭子变成了火箭推进器)。
如果你写动态语言也一样对一个变量追到它的创建,修改,销毁一生的流程,那么同样可以写出不容易出错的代码。
g00001
g00001
2020-04-10 11:01:09 +08:00
TypeScript 是不错,但是 TypeScript 导致一种错觉 - 静态类型就一定好,静态类型也是有许多缺点的 - 例如看似强大其实也会笨拙麻烦的 C++ ,只是在太过散漫自由的 JavaScript 世界里,TypeScript 有压倒性的优势。例如 JavaScript 的智能提示 - 没有一个开发环境能做得令人满意,但是 TypeScript 就可以完美的解决这些问题。

例如同样是动态语言的 aardio,有一个庞大且规范统一的标准库,语法针对智能提示做了专门的优化,仅仅只有 6.5MB 的开发环境,但是智能提示可以做到如此利索:



如果 JavaScript 也有一个如此庞大且规范统一的标准库,语法重新设计针对开发环境提前做好优化,能带来利索的智能提示,那么 TypeScript 可能就不再有压倒性的优势。
jarenduan
2020-04-10 11:01:28 +08:00
@oahebky

- 不论是内置的不同类型还是自己新建类型,只要实现了迭代,就可以被迭代的关键字语法或函数迭代地调用。
- 只要实现了字典操作 _dict['key'],那么不论是内置类型还是自己新建类型,都可以这么用。

C# foreach 实现方式类似, 索引属性也类似. C#是静态类型语言. 这些特性和是否动态类型没有关系.

动态类型不等于弱类型, 通常指在运行时进行类型检查, 它也是基于类型的. 所以不存在动态类型语言是基于"行为"的这种说法.

运行时检查的最大问题是没有编译器帮你事前发现潜在 bug. IDE 也没办法给你智能提示. 你拿到新类库以后, 也不知道调用什么, 返回什么, 属性方法怎么拼写, 必须强度依赖文档. 重构实现也非常难或者效率低. 这更多程度是软件工程范畴的问题.

搞过 C++的这些应该深有体会啊.
optional
2020-04-10 11:05:16 +08:00
引用文章质量太差,不是英文就是好文章的
fancy2020
2020-04-10 11:06:14 +08:00
个人觉得通过编译器能检查出来的 bug 通常都不是啥大问题,写 C++的时候遇到最多的应该是空指针(也就是运行时错误)。
其实原生 JS 加上合适的 lint 已经能发现大部分低级错误了。
coldsnap
2020-04-10 11:06:32 +08:00
楼主你后续附上的文章,所有标题的观点都站不住脚。我怀疑作者本人也不这么认为,只是他觉得这样写可能会火。
fancy2020
2020-04-10 11:08:34 +08:00
比较认同文章里的这几点:
Typescript is not standard
People only use Typescript because they are used to OO languages
Flow is better

其他观点确实站不住脚。。
@coldsnap
iyeatse
2020-04-10 11:09:31 +08:00
js + jsdoc + vscode 一样可以实现类似 ts 的类型系统,小工程用起来还是很爽的
augustheart
2020-04-10 11:11:54 +08:00
@oahebky 你说的这个只是接口的作用吧,动态语言的内部,追究到字节码虚拟机 jit 什么上面,其实还是静态语言那一套东西。
基本上到今天,动态语言和静态语言的区别就是同一个变量 3 秒钟之前是鸭子,3 秒钟之后它又可以变成狗,而在静态语言里面鸭子一辈子都是鸭子。这个才是它们唯一的区别(纯个人体会)
dogfeet
2020-04-10 11:15:29 +08:00
以题主链接中的片段为例:
dogfeet
2020-04-10 11:23:27 +08:00
以题主链接中的片段为例:

```typescript
function factorial (n: number): number {
if (n == 0) return 1;

return n * factorial (n-1);
}
```

在 js 中,不看完这个函数,你知道调用的时候可以传什么参数进去吗? string 支持不支持?返回值是什么类型?
js 中这个函数最后类型还是会在注释中描述出来。

复杂点的例子就是支持 uniontype 的时候,js 就更吃力,注释里面往往大段还说不清楚,必须跟到代码逻辑中才能确定。

更吃力的是,js 代码你在看的时候想跟进去看,你的编辑器跳转的根本没法保证正确,有时候跳对了地方,有时候又不是。最后你也不敢完全相信编辑器的跳转。只能自己不停的在脑子中过一些没必要的逻辑。

ts 正是因为比较严格的类型系统,编辑器能准确的跳转的函数定义的地方,真的跟起复杂项目的逻辑得心应手。

看代码,不是看字符串多少,是理解逻辑脉络。ts 这方面绝对是甩 js 几条街。

其他什么重构就不说了。
sankooc
2020-04-10 11:31:30 +08:00
你不是一个人

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

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

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

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

© 2021 V2EX