🔎 搜索词
换行符 ASI 函数类型参数规范差异
🕗 版本与回归信息
- 这是我尝试的每个版本中的行为
⏯ Playground链接
https://www.typescriptlang.org/play?#code/CYUwxgNghgTiAEAzArgOzAFwJYHtVJxwB4AVAPgAoBKALnhIChRJYFUoBbEAZwAcowCAGLwA3vBAAPXjhgZ4GAJ68EAcxAYMIGPAC88KKkXwAvk3DQ48CBoPc6hxQwY35kvQRzwi8AEzwyOwYhADp1TW0GIA
💻 代码
let x = foo < 2 > as
F.getter
🙁 实际行为
它被解析为
let x = foo<2> as F.getter;
🙂 预期行为
它应该被解析为
let x = (foo < 2) > as;
F.getter;
关于问题的附加信息
链接的代码是有效的JavaScript代码,如果tsc能按照这样的方式解析就太好了。
我知道TS通常不是JavaScript的语法超集,但Babel和SWC已经根据JS语义在TS模式下解析了这个例子。我们可以改变我们的解析器,但最好能在tsc中解决这种歧义。
6条答案
按热度按时间2w3rbyxf1#
此外,TS在这两个有效的JS示例上报告了语法错误:
kknvjkwl2#
这似乎与#33639和相关的相关链接问题相似。
rsl1atfo3#
我认为这可能是一个好主意——在JS和TS之间减少解析差异越好,但我想指出的是,prettier 经常会重新格式化代码,将被Assert的类型放在单独的一行。例如:
会被格式化为:
所以也许这里的规则更改可以比完全禁止在
as
后换行更窄?无论如何,如果这里发生了一些变化,prettier可能也需要更新。
aelbi1ox4#
FWIW, esbuild目前像TypeScript一样解析这个:https://jakebailey.dev/esbuild-playground/#v3=DYUwLgBAHhC8EDMD2SIB4ICYID4IEMBnAKADEA6Ac3DBACcg
(我有点好奇types-in-js提案是如何解析这个的。显然,在工具之间保持一致是可取的。)
mzmfm0qo5#
这个提议可能会使用类似于
::< ... >
的东西来示例化类型,所以这里没有歧义。这里的限制可能是不允许在语句开始时有换行符。c0vxltue6#
啊。