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

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

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

9045 次点击
所在节点    程序员
106 条回复
liyang5945
2022-06-30 11:15:17 +08:00
类型为 10 是什么鬼
Trim21
2022-06-30 11:16:03 +08:00
什么叫做类型是 10…
tsanie
2022-06-30 11:16:47 +08:00
是要参数默认值?那是 function f(x: number = 10),类型为 10 属实是没看懂。
cmdOptionKana
2022-06-30 11:18:32 +08:00
楼主不如说说最终想实现怎样的效果。
idealhs
2022-06-30 11:18:39 +08:00
我都不知道你在讲什么东西
LonelyShadow
2022-06-30 11:19:15 +08:00
这是考验 v 友们的 typescript 功底吗?😂
ryougifujino
2022-06-30 11:19:28 +08:00
你给 x 声明一个显式类型 10 就可以了。这个代码的原因是 TypeScript 在 x 那里类型推断的是 number 类型。
jspatrick
2022-06-30 11:20:32 +08:00
如果 x 的值必须是 10 ,那 x 就没有传参的必要吧
Carseason
2022-06-30 11:22:13 +08:00
```
let x: 10
x = 10
function f(x: 10) { }
f(x)
```
fpure
2022-06-30 11:22:50 +08:00
@jspatrick 一个例子罢了,这里的 x 还可以为 10|11 、全体偶数、全体能被 10 整除的数,如果类型系统可以表达的话
gydi
2022-06-30 11:23:28 +08:00
x 的值是 10 ,但是它的类型是 number ,意味着它的值可能是 0123456789 ,所以不匹配
IvanLi127
2022-06-30 11:25:04 +08:00
我寻思,这不是很合理吗? 你的形参都要求类型是 10 了,number 里那么多数字,你不显式强转的话,那类型检查岂不是很没有面子?
ljsh093
2022-06-30 11:26:30 +08:00
入参的类型与 number 类型不同当然会报错
fpure
2022-06-30 11:27:20 +08:00
其实我是想讨论关于类型收窄、依值类型等话题,我在想这里 x 的类型可不可能随着实际取值完美收窄,然后程序通过这样的类型系统自动证明程序的正确性
TWorldIsNButThis
2022-06-30 11:27:22 +08:00
字面量类型不是 number 类型的子类型
4196
2022-06-30 11:28:07 +08:00
type x = 10 | 11;
let X: x = 10
function f(arg: x) { }
f(X)
TWorldIsNButThis
2022-06-30 11:28:12 +08:00
@TWorldIsNButThis 说反了 是 number 类型不是字面量类型的字类型
Trim21
2022-06-30 11:28:47 +08:00
没记错的话 10|11 在 ts 里面就个合法类型,你把 12 传进去是会报错的
Trim21
2022-06-30 11:30:34 +08:00
const x=10 as const;

f(x) 就不会报错了

至于类型收窄等等等等 ts 也是会做的
mxT52CRuqR6o5
2022-06-30 11:30:48 +08:00
不算
真正的静态类型语言的类型系统整不出这种操作
这个只能算 ts 类型系统,算不算遗憾还另说

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

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

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

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

© 2021 V2EX