TypeScript 允许JSX命名空间中的接口指定元素类类型,

5us2dqdw  于 4个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(144)

我们正在编写一个非React库,该库使用TS的JSX支持,并在JSX命名空间中定义自定义接口。除非我们非常错误地理解(这方面的文档似乎有点过时?我们目前的大部分理解来自于阅读这里的问题,我们可能遗漏了一些东西。)ElementClass似乎可以用于定义元素示例类型的类型,但没有接口来限制元素类类型的成员。
我们有一个自定义组件基类和一个相当于React的createElement函数。我们的createElement函数需要能够创建组件类的示例。为了以类型安全的方式做到这一点,我们需要能够为元素类类型指定一个接口,该接口可以要求特定的构造函数签名。
老实说,这似乎是当前实现中的一个疏忽。在React本身中,甚至可以创建具有不兼容构造函数的组件,这些组件将在运行时失败。

lnxxn5zx

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
当然,这是一个稍微简化的例子。

emeijp43

emeijp432#

请注意,计划是让我们的基类实现这个构造函数并分配所需的属性,因此在大多数情况下,组件类甚至不需要做任何与构造函数有关的事情,但如果它们做了,它们将被迫遵守。

yizd12fk

yizd12fk3#

看起来合理。我们之前没有实现这样的功能,只是因为React组件几乎从不覆盖其基类构造函数,因此出错的可能性很小。

ukxgm1gy

ukxgm1gy4#

如果我们能得到这个和#13618(设置子项限制),那么这个功能会感觉更完整,并适用于更广泛的DSL使用案例。

hmtdttj4

hmtdttj45#

顺便说一下,Mithril需要这个功能,以便TS用户能够在使用JSX的情况下,除了类之外,还能使用其他组件。我们有很多组件不是这样的 - 很多人更喜欢对象或闭包组件,以及 even our docs don't just use class components
这基本上是我们在任何实际程度上支持TS中的JSX的一个障碍,如果这有助于解释添加此功能的好用例。
对我们来说,像 type ElementType<P> = ... 这样的简单东西就可以工作。(我们不能使用接口,因为我们需要在这里使用联合。)返回类型只是工厂中有效组件类型的名称。

bn31dyow

bn31dyow6#

顺便说一下,我们确实支持在JS中使用JSX,所以TS在这里是特例。我只是想澄清一下。

w8ntj3qf

w8ntj3qf7#

@RyanCavanaugh 你有关于这个的最新状态更新吗?我知道这是一个有点老的问题。

eiee3dmh

eiee3dmh8#

你能提供一些示例代码吗?这样我就可以验证我是否理解你的意思了。

iq0todco

iq0todco9#

基本上,您想要 JSX.ElementClass ,除了表达式 <X /> 中的构造函数类型 typeof X 以及当前检查示例类型 X 之外?

相关问题