TypeScript 禁止在函数示例化后换行 ```markdown 禁止在函数示例化后换行 ```

bmvo0sr5  于 4个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(40)

🔎 搜索词

换行符 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中解决这种歧义。

2w3rbyxf

2w3rbyxf1#

此外,TS在这两个有效的JS示例上报告了语法错误:

let x = foo < 2 > as;
F.getter;
let x = foo < 2 > as
const y = 2;
kknvjkwl

kknvjkwl2#

这似乎与#33639和相关的相关链接问题相似。

rsl1atfo

rsl1atfo3#

我认为这可能是一个好主意——在JS和TS之间减少解析差异越好,但我想指出的是,prettier 经常会重新格式化代码,将被Assert的类型放在单独的一行。例如:

const res = foo<2> as SomeLongTypeName | SomeOtherLongTypeName | SomeFinalTypeName;

会被格式化为:

const res = foo<2> as
  | SomeLongTypeName
  | SomeOtherLongTypeName
  | SomeFinalTypeName;

所以也许这里的规则更改可以比完全禁止在as后换行更窄?
无论如何,如果这里发生了一些变化,prettier可能也需要更新。

aelbi1ox

aelbi1ox4#

FWIW, esbuild目前像TypeScript一样解析这个:https://jakebailey.dev/esbuild-playground/#v3=DYUwLgBAHhC8EDMD2SIB4ICYID4IEMBnAKADEA6Ac3DBACcg
(我有点好奇types-in-js提案是如何解析这个的。显然,在工具之间保持一致是可取的。)

mzmfm0qo

mzmfm0qo5#

这个提议可能会使用类似于::< ... >的东西来示例化类型,所以这里没有歧义。这里的限制可能是不允许在语句开始时有换行符。

相关问题