TypeScript 为Flow的新组件语法添加支持

mftmpeh8  于 2个月前  发布在  TypeScript
关注(0)|答案(8)|浏览(37)

🔍 搜索词

"syntax", "flow", "component", "tsx"

✅ 可实现性检查清单

⭐ 建议

首先,我要道歉;这个请求不满足最后三个可实现性检查。但如果我不标记它们,我就不能提交。话虽如此,如果TypeScript团队的某人至少能阅读这个提案,我会非常感激。
最近,flow已经添加了一种新的语法来编写组件和钩子。对于React开发人员来说,这太棒了,而作为一个使用(并且喜欢)TypeScript的人,我希望在TSX文件上也能有这样的东西。
我知道在typescript中可以做的事有限;例如,我不指望typescript会检查钩子和其他React特定的东西的规则。我知道像Solid和Stencil这样的东西也使用JSX。
坦率地说:我想要糖。大多数关注这个新功能的影响力者都提到,Typescript极有可能不会实现它。但我还是决定尝试一下,即使只是为了理解原因。
从更实际的Angular 来看,以下是我期望在现实场景中看到的:

  • 这些更改只会影响TSX文件。
  • component 块会被转换为 function 组件。
  • hook 块会被转换为函数。
  • 渲染类型是很好的。如果我没猜错的话,有一种奇怪的方法可以在typescript中做到同样的事情,但是得到更明确的东西不会有什么坏处。

📃 激励示例

这是解释我在说什么的帖子: https://medium.com/flow-type/announcing-component-syntax-b6c5285660d0

💻 用例

  1. 你打算用这个做什么?纯粹而精致的语法糖。
  2. 目前的方法存在什么缺点?对于组件,目前有5-6种处理props的方法,但新的组件语法有可能统一如何做事,减少大型代码库中新开发者的摩擦。我建议你查看这个视频: https://youtu.be/HOFIefkepMA?si=i45CFr72m2GCaH5l
  3. 在等待期间你正在使用什么解决方法?写另一个工具将这种语法转换为typescript并不是不可能的,但那将是Web开发生态系统中已经臃肿的另一个工具。
s1ag04yj

s1ag04yj1#

但是新的组件语法有可能统一事物的处理方式。
除非这种语法被JSX支持,否则我无法看到这种情况发生。
直到今天,我一直认为Flow是一种类型检查器。

7fyelxc5

7fyelxc52#

我也不觉得它有什么吸引力,但难道不能对JSX本身有同样的React吗?它也是React的一种特殊语法,需要被转译。

9q78igpj

9q78igpj3#

随着时间的推移,JSX已被证明在各种场景中非常有用。React转换仅需要一个类似createElement的函数,对于其他用例,还有许多其他流行的转换。它已在React、类似React的其他完全不像React VDOM基于系统以及发出HTML字符串、原始DOM元素和其他系统的系统中使用。每个人都希望为在Javascript中制作类似HTML的合理模板语法,而JSX很好地满足了这一需求。
相比之下,这些更改更具React特定性。component强制执行非常特定的签名。hook遵循React定义的“钩子规则”的兔子洞。

kqlmhetl

kqlmhetl4#

Remember when everyone said Flow was better because it wasn't adding transpiles-to-runtime stuff like enum and namespace to JS? TypeScript remembers 👴

xghobddn

xghobddn5#

组件语法的优势并不在于其糖衣;它更多的是给代码赋予语义,并允许更严格的类型检查,如返回类型为 ReactNode ,参数为只读等。这种优势可以传递到其他linters(如eslint-plugin-react)中,以便它们可以强制执行正确的钩子调用等(完全理解如果TypeScript不想承担这种检查)。

lhcgjxsq

lhcgjxsq6#

严肃地说,在jsx: preservenoEmit下,将component解析为TSX文件中function的别名似乎并不成问题(这将使component保留在输出的JSX文件中),否则跳过Flow推断的所有特定于元数据的规则。

就我所理解的,他们的component-to-function编译器不需要任何类型注解来正确执行操作。

s8vozzvw

s8vozzvw7#

正如其他人所说,React并不是唯一使用JSX的框架。作为一个构建过JSX框架的人,我对更多的语法糖并不关心,JSX已经包含了足够多的东西。它不足之处在于类型限制,目前我们不能做类似指定"渲染"类型的事情,因为JSX只允许一个静态返回类型JSX.Element。然而,像#14729这样的东西可以让JSX从泛型函数(createElement, jsx, h)中获取返回类型,这将是非常有价值的。如果你有这个功能,你可以实现"渲染",并限制子类型的类型。两个这样的例子:递归检查或用"渲染"符号和关联类型标记组件。

不清楚component的好处是什么,flow本可以同样实现"渲染"类型而不需要它。

izj3ouym

izj3ouym8#

我认为最大的优势是更好地处理props。
当前:

function MyComponent({ text = "Hello!", onClick }: { text: string, onClick: () => void }) {
  return <div onClick={onClick}>{text}</div>;
}

组件语法将允许的功能:

component MyComponent(text: string = "Hello!", onClick: () => void) {
  return <div onClick={onClick}>{text}</div>;
}

我希望能够通过在tsconfig中添加插件来实现这个功能。

相关问题