0x709394 beancount 记账快一年了,在折腾一些数据可视化。用到了这个项目fava-dashboards 可以通过写一个 yaml 配置文件很灵活的做各种图表。但是 yaml 不好写,先不说 yaml 本身的坑, fava-dashboards 里面好几个字段都是大段的JavaScript代码 / Jinja2 模板 ,编辑体验极差。 JavaScript 写着写着,我就想到了写 JSX。开始网上冲浪发现了这篇文章 Considering, Then Abandoning JSX for Strongly-Typed YAML Configuration 文章是 2020 年的,而且最后放弃了。但 2024 年来看有些问题是可以解决的。 比如说 div 的类型干不掉这种。 所以尝试了一下。https://github.com/andreasgerstmayr/fava-dashboards/issues/32 类型并不是标得特别全,够用就行。。。 但是还留了一个疑问 children 的类型似乎不太好使,不知道有没有办法解决?
0x709394 把可选去掉确实就报错了。我还是没明白你说的 infer 推导 /wl。尝试用泛型限制函数入参类型, Dashboards 的 props extends {children: IDashboard[]} 如果我把一个 Dashboards 塞到 Dashbords 的 children 下, 写成 JSX 没报错,写成函数调用会提示报错
hsxfjames 因为你的 jsx 定义也是不完备的, ts 不认为你的嵌套元素是外层元素的 children 。可以用 assert 断言一下类型,我估计你写成 jsx 形式是符合 children: any 的。
0x709394 hsxfjames 仔细读了文档 是返回值的问题。 ts 知道嵌套元素是外层元素的 children property 因为声明了 JSX. ElementChildrenAttribute 但是这里的问题是我没有声明JSX.Element 这就导致写成 JSX 形式的东西最后都是 any, 不管function 声明了什么东西都是 any。 应该要把JSX.Element声明 children 一个通用联合类型,然后所有children props 都声明成 JSX.Element 。 但这样的类型也检查不出啥玩意了 Playground
hsxfjames 嗯,上周和这周都想了想,应该没办法表示出对 children 的限制。 还有个思路是用 eslint 根据 ast 去扫,具体怎么搞我忘了,比如可以做到扫描出 for ... of 不让用或者 .forEach 不让用这样。或许可以尝试去拿 jsx 的 ast ,把 parent 和 children 的限制关系表示成 json 结构的配置项,这样就足够灵活了(