1
1
import {
2
- ComponentObjectPropsOptions,
3
- ExtractPropTypes,
2
+ type ComponentObjectPropsOptions,
3
+ type ExtractPropTypes,
4
+ type DefineSetupFnComponent,
4
5
defineComponent,
5
6
h,
6
7
inject,
@@ -13,15 +14,30 @@ import {
13
14
import domElements, { type SupportedHTMLElements } from '@/src/constants/domElements'
14
15
import { type ExpressionType, generateClassName, generateComponentName, insertExpressions, injectStyle, removeStyle } from '@/src/utils'
15
16
import { isStyledComponent, isValidElementType, isVueComponent } from '@/src/helper'
16
- import { DefaultTheme } from './providers/theme'
17
+ import type { DefaultTheme } from './providers/theme'
17
18
18
19
type Attrs = Record<string, any>
19
20
20
- type BaseContext<T> = T & { theme: DefaultTheme }
21
- type PropsDefinition<T> = {
21
+ export type BaseContext<T> = T & { theme: DefaultTheme }
22
+
23
+ export type PropsDefinition<T> = {
22
24
[K in keyof T]: T[K]
23
25
}
24
- function baseStyled<T extends object>(target: string | InstanceType<any>, propsDefinition?: PropsDefinition<T>) {
26
+
27
+ // 定义 styledComponent 类型
28
+ interface StyledComponent<T extends object> {
29
+ <P>(
30
+ styles: TemplateStringsArray,
31
+ ...expressions: (
32
+ | ExpressionType<BaseContext<P & ExtractPropTypes<PropsDefinition<T>>>>
33
+ | ExpressionType<BaseContext<P & ExtractPropTypes<PropsDefinition<T>>>>[]
34
+ )[]
35
+ ): DefineSetupFnComponent<{ as?: string; props?: P } & ExtractPropTypes<PropsDefinition<T>>>
36
+
37
+ attrs<A extends Attrs = Record<string, any>>(attrs: A): StyledComponent<T>
38
+ }
39
+
40
+ function baseStyled<T extends object>(target: string | InstanceType<any>, propsDefinition?: PropsDefinition<T>): StyledComponent<T> {
25
41
if (!isValidElementType(target)) {
26
42
throw Error('The element is invalid.')
27
43
}
@@ -71,7 +87,7 @@ function baseStyled<T extends object>(target: string | InstanceType<any>, propsD
71
87
watch(
72
88
tailwindClasses,
73
89
(classNames) => {
74
- myAttrs.value.class += ` ${defaultClassName} ${ classNames.join(' ')}`
90
+ myAttrs.value.class += ` ${classNames.join(' ')}`
75
91
},
76
92
{ deep: true },
77
93
)
@@ -141,4 +157,4 @@ domElements.forEach((domElement: SupportedHTMLElements) => {
141
157
styled[domElement] = baseStyled(domElement)
142
158
})
143
159
144
- export { styled }
160
+ export { styled, styled as default }
0 commit comments