这算不算是静态类型系统的缺憾

2022-06-30 11:11:01 +08:00
 fpure

以这段 typescript 代码为例,f 期待一个类型为 10 的参数,x 等于 10 ,但是因为 x 的类型为 number ,所以不匹配

9081 次点击
所在节点    程序员
106 条回复
4196
2022-06-30 11:31:37 +08:00
我这个算你说的类型收窄吗?@fpure
chendy
2022-06-30 11:31:39 +08:00
没写过 ts ,试了一下还挺神奇,10 还真是个类型,而且唯一合法的值就是 10
但是什么叫静态类型系统的缺憾,把流程逻辑写在参数声明上感觉并不是什么好主意
yolee599
2022-06-30 11:32:30 +08:00
看样子你是想设计一个万能函数,输入所有东西都能输出答案?
Jooooooooo
2022-06-30 11:33:58 +08:00
像是符合直觉的报错

难道你希望这个运行期再报错吗? 或者根本不报错?
stein42
2022-06-30 11:38:00 +08:00
如果 x 的值来自一个复杂函数,函数运行时间可能很久甚至无限。
如果 x 的值来自用户输入。
类型检查是在不运行程序的情况下对程序进行分析,能够在有限的时间给出结果。
类型检查是保守的,通过检查代表没有类型错误,不通过不代表一定有问题,ts 不通过检查也可以继续运行。

ps: ts 里面 10 是一个合法的类型,它只有一个值。
cheng6563
2022-06-30 11:39:33 +08:00
类型为 10 ,活久见。。。
nulIptr
2022-06-30 11:41:17 +08:00
类型不就是用来静态分析的吗,你给静态分析分析你这个 x 变量为啥是 10
wenzichel
2022-06-30 11:41:49 +08:00
小类型可以给更大范围的类型赋值,但反过来就不行了。

number 的范围很大,但 10 的范围就只有 10 。
chenmobuys
2022-06-30 11:42:19 +08:00
虽然不是很喜欢 ts ,但是你这个吐槽也没到点子上去啊。
rrfeng
2022-06-30 11:44:18 +08:00
1. 逻辑没错
2. 问题存在
3. 毫无意义
aguesuka
2022-06-30 11:44:56 +08:00
是 ts 的, 但不是 type throery 的, 你需要的是 Refinement type
GiantHard
2022-06-30 11:47:55 +08:00
特定情况下 TS 是可以通过类型收窄来帮助验证代码逻辑的,https://www.typescriptlang.org/docs/handbook/2/narrowing.html
Envov
2022-06-30 11:48:08 +08:00
ts 里面宽的不能给窄的,f 函数只能接受 x 为 10 ,你传入的 x 类型 number ,它可能是 10 也可能是别的数
bxtx999
2022-06-30 11:48:14 +08:00
aguesuka
2022-06-30 11:50:07 +08:00
@fpure "我在想这里 x 的类型可不可能随着实际取值完美收窄,然后程序通过这样的类型系统自动证明程序的正确性"
完全可以 PROGRAM = PROOF

https://www.lix.polytechnique.fr/Labo/Samuel.Mimram/teaching/INF551/course.pdf
dcsuibian
2022-06-30 11:52:42 +08:00
类型 10 和 number 可能会让其它与语言的用户产生困扰。换种说法:
现在有基类 A 和派生类 B ,函数 f() 只能接收一个派生类 B 的对象。此时变量 x 被声明为基类 A ,但实际里面放的是 派生类 B 的对象。
于是 f(x) 时报错了,因为编译器认为 x 不一定属于派生类 B 。
gzf6
2022-06-30 11:56:51 +08:00
as const
dcsuibian
2022-06-30 12:22:03 +08:00
你说“缺憾”的话也确实可以说是,但更准确地说就是“做不到的事”。就像人不会飞一样。

虽然在我们看来,x 必然是 10 ,因为里面只隔了一行无意义的函数定义。但对于编译器来说,要做出这种判断,隔一行与隔一千、一万行代码相同。它要做的是“理解中间的代码干了什么,会有什么影响”。而这的要求就太高了,基本可以踢掉一些低级程序员了。
CokeMine
2022-06-30 12:28:25 +08:00
10 是 number 的子集。。。
Pythoner666666
2022-06-30 12:30:21 +08:00
10 | 11 | 12 ....这些 只能算作 number 的子集

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

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

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

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

© 2021 V2EX