🔍 搜索词
"syntax", "flow", "component", "tsx"
✅ 可实现性检查清单
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的改变
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型发射不同的JS的情况下实现
- 这不是一个运行时特性(例如库功能、具有JavaScript输出的非ECMAScript语法、新的JS语法糖等)
- 这不是一个请求添加新实用类型的请求: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- 这个特性将与我们设计目标的其他部分一致: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ 建议
首先,我要道歉;这个请求不满足最后三个可实现性检查。但如果我不标记它们,我就不能提交。话虽如此,如果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
💻 用例
- 你打算用这个做什么?纯粹而精致的语法糖。
- 目前的方法存在什么缺点?对于组件,目前有5-6种处理props的方法,但新的组件语法有可能统一如何做事,减少大型代码库中新开发者的摩擦。我建议你查看这个视频: https://youtu.be/HOFIefkepMA?si=i45CFr72m2GCaH5l
- 在等待期间你正在使用什么解决方法?写另一个工具将这种语法转换为typescript并不是不可能的,但那将是Web开发生态系统中已经臃肿的另一个工具。
8条答案
按热度按时间s1ag04yj1#
但是新的组件语法有可能统一事物的处理方式。
除非这种语法被JSX支持,否则我无法看到这种情况发生。
直到今天,我一直认为Flow是一种类型检查器。
7fyelxc52#
我也不觉得它有什么吸引力,但难道不能对JSX本身有同样的React吗?它也是React的一种特殊语法,需要被转译。
9q78igpj3#
随着时间的推移,JSX已被证明在各种场景中非常有用。React转换仅需要一个类似
createElement
的函数,对于其他用例,还有许多其他流行的转换。它已在React、类似React的其他完全不像React VDOM基于系统以及发出HTML字符串、原始DOM元素和其他系统的系统中使用。每个人都希望为在Javascript中制作类似HTML的合理模板语法,而JSX很好地满足了这一需求。相比之下,这些更改更具React特定性。
component
强制执行非常特定的签名。hook
遵循React定义的“钩子规则”的兔子洞。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 👴
xghobddn5#
组件语法的优势并不在于其糖衣;它更多的是给代码赋予语义,并允许更严格的类型检查,如返回类型为
ReactNode
,参数为只读等。这种优势可以传递到其他linters(如eslint-plugin-react
)中,以便它们可以强制执行正确的钩子调用等(完全理解如果TypeScript不想承担这种检查)。lhcgjxsq6#
严肃地说,在
jsx: preserve
或noEmit
下,将component
解析为TSX文件中function
的别名似乎并不成问题(这将使component
保留在输出的JSX文件中),否则跳过Flow推断的所有特定于元数据的规则。就我所理解的,他们的
component
-to-function
编译器不需要任何类型注解来正确执行操作。s8vozzvw7#
正如其他人所说,React并不是唯一使用JSX的框架。作为一个构建过JSX框架的人,我对更多的语法糖并不关心,JSX已经包含了足够多的东西。它不足之处在于类型限制,目前我们不能做类似指定"渲染"类型的事情,因为JSX只允许一个静态返回类型
JSX.Element
。然而,像#14729这样的东西可以让JSX从泛型函数(createElement
,jsx
,h
)中获取返回类型,这将是非常有价值的。如果你有这个功能,你可以实现"渲染",并限制子类型的类型。两个这样的例子:递归检查或用"渲染"符号和关联类型标记组件。不清楚
component
的好处是什么,flow本可以同样实现"渲染"类型而不需要它。izj3ouym8#
我认为最大的优势是更好地处理props。
当前:
组件语法将允许的功能:
我希望能够通过在tsconfig中添加插件来实现这个功能。