1
- import {
2
- type ValidComponent ,
3
- type Component ,
4
- type JSX ,
5
- type ComponentProps ,
6
- splitProps ,
7
- } from 'solid-js'
1
+ import { type Component , type JSX , type ComponentProps , splitProps } from 'solid-js'
8
2
import { Dynamic } from 'solid-js/web'
9
3
10
4
type DOMElements = keyof JSX . IntrinsicElements
@@ -29,8 +23,8 @@ type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : nev
29
23
export type Assign < A , B > = DistributiveOmit < A , keyof B > & B
30
24
31
25
type MergeWithAs <
32
- Default extends ValidComponent ,
33
- Component extends ValidComponent ,
26
+ Default extends ElementType ,
27
+ Component extends ElementType ,
34
28
PermanentProps extends Record < never , never > ,
35
29
DefaultProps extends Record < never , never > ,
36
30
ComponentProps extends Record < never , never > ,
@@ -57,15 +51,15 @@ type MergeWithAs<
57
51
* overriding props but also because somehow it is needed to get the props correctly,
58
52
* Merge does clone the first object so that might have something to do with it.
59
53
*/
60
- | Assign < DefaultProps , PermanentProps & { as ?: Default } >
54
+ | Assign < DefaultProps , PermanentProps & { as ?: Default | ElementType } >
61
55
| Assign < ComponentProps , PermanentProps & { as ?: Component } >
62
56
: never
63
57
64
58
export type ComponentWithAs <
65
- Component extends ValidComponent ,
59
+ Component extends ElementType ,
66
60
Props extends Record < never , never > = Record < never , never > ,
67
61
> = {
68
- < AsComponent extends ValidComponent = Component > (
62
+ < AsComponent extends ElementType = Component > (
69
63
props : MergeWithAs <
70
64
Component ,
71
65
AsComponent ,
@@ -80,21 +74,21 @@ export type HTMLPolymorphicComponents<Props extends Record<never, never> = Recor
80
74
[ Tag in DOMElements ] : ComponentWithAs < Tag , Props >
81
75
}
82
76
83
- export type HTMLPolymorphicProps < T extends ValidComponent > = Omit < ComponentProps < T > , 'ref' > & {
84
- as ?: ValidComponent
77
+ export type HTMLPolymorphicProps < T extends ElementType > = Omit < ComponentProps < T > , 'ref' > & {
78
+ as ?: ElementType
85
79
}
86
80
87
81
type PolymorphFactory <
88
82
Props extends Record < never , never > = Record < never , never > ,
89
83
Options = never ,
90
84
> = {
91
- < T extends ValidComponent , P extends Record < never , never > = Props > (
85
+ < T extends ElementType , P extends Record < never , never > = Props > (
92
86
component : T ,
93
87
option ?: Options ,
94
88
) : ComponentWithAs < T , P >
95
89
}
96
90
97
- function defaultStyled ( originalComponent : ValidComponent ) {
91
+ function defaultStyled ( originalComponent : ElementType ) {
98
92
// any is required for the import('solid/web').ValidComponent typings:
99
93
// eslint-disable-next-line @typescript-eslint/no-explicit-any
100
94
return ( props : ComponentProps < ComponentWithAs < any > > ) => {
@@ -106,7 +100,7 @@ function defaultStyled(originalComponent: ValidComponent) {
106
100
}
107
101
108
102
interface PolyFactoryParam <
109
- Component extends ValidComponent ,
103
+ Component extends ElementType ,
110
104
Props extends Record < never , never > ,
111
105
Options ,
112
106
> {
@@ -125,7 +119,7 @@ interface PolyFactoryParam<
125
119
export function polymorphicFactory <
126
120
Props extends Record < never , never > ,
127
121
Options = never ,
128
- Component extends ValidComponent = ValidComponent ,
122
+ Component extends ElementType = ElementType ,
129
123
> ( { styled = defaultStyled } : PolyFactoryParam < Component , Props , Options > = { } ) {
130
124
const cache = new Map < Component , ComponentWithAs < Component , Props > > ( )
131
125
0 commit comments