我们正在编写一个非React库,该库使用TS的JSX支持,并在JSX命名空间中定义自定义接口。除非我们非常错误地理解(这方面的文档似乎有点过时?我们目前的大部分理解来自于阅读这里的问题,我们可能遗漏了一些东西。)ElementClass似乎可以用于定义元素示例类型的类型,但没有接口来限制元素类类型的成员。
我们有一个自定义组件基类和一个相当于React的createElement函数。我们的createElement函数需要能够创建组件类的示例。为了以类型安全的方式做到这一点,我们需要能够为元素类类型指定一个接口,该接口可以要求特定的构造函数签名。
老实说,这似乎是当前实现中的一个疏忽。在React本身中,甚至可以创建具有不兼容构造函数的组件,这些组件将在运行时失败。
9条答案
按热度按时间lnxxn5zx1#
是的,完全正确。
除非我们对整个JSX的工作方式有所误解(我们是.NET开发人员,有点不适应,这是可能的),createElement函数的第一个参数是
typeof X
,为了真正有用地使用它,我们需要创建一个X
的示例。如果我们能控制构造函数的语法,我们就能以可靠和类型安全的方式做到这一点。对于我们的特定用例,我们可能想要类似的东西:
type ComponentConstructor<TProps> = new (props: TProps) => Component<TProps>
或者也许
type ComponentConstructor<TComponent extends Component<TProps>, TProps> = new (props: TProps) => TComponent
当然,这是一个稍微简化的例子。
emeijp432#
请注意,计划是让我们的基类实现这个构造函数并分配所需的属性,因此在大多数情况下,组件类甚至不需要做任何与构造函数有关的事情,但如果它们做了,它们将被迫遵守。
yizd12fk3#
看起来合理。我们之前没有实现这样的功能,只是因为React组件几乎从不覆盖其基类构造函数,因此出错的可能性很小。
ukxgm1gy4#
如果我们能得到这个和#13618(设置子项限制),那么这个功能会感觉更完整,并适用于更广泛的DSL使用案例。
hmtdttj45#
顺便说一下,Mithril需要这个功能,以便TS用户能够在使用JSX的情况下,除了类之外,还能使用其他组件。我们有很多组件不是这样的 - 很多人更喜欢对象或闭包组件,以及 even our docs don't just use class components 。
这基本上是我们在任何实际程度上支持TS中的JSX的一个障碍,如果这有助于解释添加此功能的好用例。
对我们来说,像
type ElementType<P> = ...
这样的简单东西就可以工作。(我们不能使用接口,因为我们需要在这里使用联合。)返回类型只是工厂中有效组件类型的名称。bn31dyow6#
顺便说一下,我们确实支持在JS中使用JSX,所以TS在这里是特例。我只是想澄清一下。
w8ntj3qf7#
@RyanCavanaugh 你有关于这个的最新状态更新吗?我知道这是一个有点老的问题。
eiee3dmh8#
你能提供一些示例代码吗?这样我就可以验证我是否理解你的意思了。
iq0todco9#
基本上,您想要
JSX.ElementClass
,除了表达式<X />
中的构造函数类型typeof X
以及当前检查示例类型X
之外?