When I try to use a web component in my Solid.js project (instead of building one), it doesn't recognize the tag as it is not an intrinsic element. How can I setup solid.js to recognize web components?
This is how you can extend the global types, to get rid of TS error:
import type { ComponentProps } from "solid-js"
declare module "solid-js" {
namespace JSX {
interface IntrinsicElements {
"aero-modal": ComponentProps<"div"> & { foo: number }
}
}
}
I don't know how to get the custom elements themselves to work though... But I would assume they already do. They are custom elements after all, and solid doesn't judge. If the tag in JSX is in lowercase, it should treat it as an html element.
Note: The ComponentProps<"div"> & { foo: number } I've put there, are the props. You could put an {} there if the component doesn't have any.
declare module 'solid-js' {
namespace JSX {
type ElementProps<T> = {
// Add both the element's prefixed properties and the attributes
[K in keyof T]: Props<T[K]> & HTMLAttributes<T[K]>;
}
// Prefixes all properties with `prop:` to match Solid's property setting syntax
type Props<T> = {
[K in keyof T as `prop:${string & K}`]?: T[K];
}
interface IntrinsicElements extends ElementProps<HTMLElementTagNameMap> {
}
}
}
If you're extending HTMLElement, a more general solution may be
declare module 'solid-js' {
namespace JSX {
type ElementProps<T> = {
// Add both the element's prefixed properties and the attributes
[K in keyof T]: Props<T[K]> & HTMLAttributes<T[K]>;
}
// Prefixes all properties with `prop:` to match Solid's property setting syntax
type Props<T> = {
[K in keyof T as `prop:${string & K}`]?: T[K];
}
interface IntrinsicElements extends ElementProps<HTMLElementTagNameMap> {
}
}
}
发布评论
评论(2)
这就是您可以扩展全局类型的方式,以摆脱TS错误:
我不知道如何使自定义元素自己工作...但是我认为它们已经做到了。它们毕竟是自定义元素,而坚实的元素也不判断。如果JSX中的标签处于小写状态,则应将其视为HTML元素。
注意:
componentProps&lt;“ div”&gt; &amp; {foo:number}
我放在那里,是道具。如果组件没有任何内容,则可以将{}
放在那里。This is how you can extend the global types, to get rid of TS error:
I don't know how to get the custom elements themselves to work though... But I would assume they already do. They are custom elements after all, and solid doesn't judge. If the tag in JSX is in lowercase, it should treat it as an html element.
Note: The
ComponentProps<"div"> & { foo: number }
I've put there, are the props. You could put an{}
there if the component doesn't have any.如果您正在扩展
htmlelement
,则可以更通用的解决方案来自固体GitHub上的问题。
If you're extending
HTMLElement
, a more general solution may beFrom an issue on the Solid github.