Skip to content

Commit 00db380

Browse files
committed
feat: support __typeEl
1 parent 279a2eb commit 00db380

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

packages-private/dts-test/defineVaporComponent.test-d.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ declare const MyButton: DefineVaporComponent<
10411041
{},
10421042
{},
10431043
{},
1044+
Block,
10441045
true,
10451046
Readonly<ExtractPropTypes<{}>>,
10461047
VaporPublicProps & AllowedComponentProps & ComponentCustomProps,
@@ -1196,6 +1197,24 @@ describe('__typeRefs backdoor, object syntax', () => {
11961197
expectType<number>(refs.child.refs.foo)
11971198
})
11981199

1200+
describe('__typeEl backdoor', () => {
1201+
const Comp = defineVaporComponent({
1202+
__typeEl: {} as HTMLAnchorElement,
1203+
})
1204+
const c = new Comp()
1205+
expectType<HTMLAnchorElement>(c.block)
1206+
1207+
const Comp1 = defineVaporComponent({
1208+
render: () => document.createElement('a'),
1209+
})
1210+
const c1 = new Comp1()
1211+
expectType<HTMLAnchorElement>(c1.block)
1212+
1213+
const Comp2 = defineVaporComponent(() => document.createElement('a'))
1214+
const c2 = new Comp2()
1215+
expectType<HTMLAnchorElement>(c2.block)
1216+
})
1217+
11991218
defineVaporComponent({
12001219
props: {
12011220
foo: [String, null],

packages/runtime-vapor/src/apiDefineComponent.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ export type VaporPublicProps = ReservedProps &
3232
AllowedComponentProps &
3333
ComponentCustomProps
3434

35-
export type RenderReturn = VNode | Block | RenderReturn[]
35+
export type RenderReturn<T extends Block = Block> =
36+
| VNode
37+
| T
38+
| RenderReturn<T>[]
3639

3740
export type DefineVaporComponent<
3841
RuntimePropsOptions = {},
@@ -42,6 +45,7 @@ export type DefineVaporComponent<
4245
Slots extends StaticSlots = StaticSlots,
4346
Exposed extends Record<string, any> = Record<string, any>,
4447
TypeRefs extends Record<string, unknown> = {},
48+
TypeEl extends Block = Block,
4549
MakeDefaultsOptional extends boolean = true,
4650
InferredProps = string extends RuntimePropsKeys
4751
? ComponentObjectPropsOptions extends RuntimePropsOptions
@@ -62,6 +66,7 @@ export type DefineVaporComponent<
6266
Emits,
6367
Slots,
6468
Exposed,
69+
TypeEl,
6570
TypeRefs
6671
>
6772
> &
@@ -78,12 +83,13 @@ export type DefineVaporSetupFnComponent<
7883
Emits extends EmitsOptions = {},
7984
Slots extends SlotsType = SlotsType,
8085
Exposed extends Record<string, any> = Record<string, any>,
86+
TypeEl extends Block = Block,
8187
ResolvedProps extends Record<string, any> = Props &
8288
EmitsToProps<Emits> &
8389
VaporPublicProps,
8490
> = new (
8591
props?: ResolvedProps,
86-
) => VaporComponentInstance<ResolvedProps, Emits, Slots, Exposed>
92+
) => VaporComponentInstance<ResolvedProps, Emits, Slots, Exposed, TypeEl>
8793

8894
// overload 1: direct setup function
8995
// (uses user defined props interface)
@@ -93,6 +99,7 @@ export function defineVaporComponent<
9399
RuntimeEmitsKeys extends string = string,
94100
Slots extends StaticSlots = StaticSlots,
95101
Exposed extends Record<string, any> = Record<string, any>,
102+
TypeEl extends Block = Block,
96103
>(
97104
setup: (
98105
props: Props,
@@ -102,7 +109,7 @@ export function defineVaporComponent<
102109
attrs: Record<string, any>
103110
expose: (exposed: Exposed) => void
104111
},
105-
) => RenderReturn,
112+
) => RenderReturn<TypeEl>,
106113
extraOptions?: ObjectVaporComponent<
107114
(keyof Props)[],
108115
Emits,
@@ -111,13 +118,14 @@ export function defineVaporComponent<
111118
Exposed
112119
> &
113120
ThisType<void>,
114-
): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed>
121+
): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed, TypeEl>
115122
export function defineVaporComponent<
116123
Props extends Record<string, any>,
117124
Emits extends EmitsOptions = {},
118125
RuntimeEmitsKeys extends string = string,
119126
Slots extends StaticSlots = StaticSlots,
120127
Exposed extends Record<string, any> = Record<string, any>,
128+
TypeEl extends Block = Block,
121129
>(
122130
setup: (
123131
props: Props,
@@ -127,7 +135,7 @@ export function defineVaporComponent<
127135
attrs: Record<string, any>
128136
expose: (exposed: Exposed) => void
129137
},
130-
) => RenderReturn,
138+
) => RenderReturn<TypeEl>,
131139
extraOptions?: ObjectVaporComponent<
132140
ComponentObjectPropsOptions<Props>,
133141
Emits,
@@ -136,7 +144,7 @@ export function defineVaporComponent<
136144
Exposed
137145
> &
138146
ThisType<void>,
139-
): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed>
147+
): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed, TypeEl>
140148

141149
// overload 2: defineVaporComponent with options object, infer props from options
142150
export function defineVaporComponent<
@@ -163,13 +171,15 @@ export function defineVaporComponent<
163171
: ExtractPropTypes<RuntimePropsOptions>
164172
: { [key in RuntimePropsKeys]?: any },
165173
TypeRefs extends Record<string, unknown> = {},
174+
TypeEl extends Block = Block,
166175
>(
167176
options: ObjectVaporComponent<
168177
RuntimePropsOptions | RuntimePropsKeys[],
169178
ResolvedEmits,
170179
RuntimeEmitsKeys,
171180
Slots,
172181
Exposed,
182+
TypeEl,
173183
InferredProps
174184
> & {
175185
/**
@@ -184,6 +194,10 @@ export function defineVaporComponent<
184194
* @private for language-tools use only
185195
*/
186196
__typeRefs?: TypeRefs
197+
/**
198+
* @private for language-tools use only
199+
*/
200+
__typeEl?: TypeEl
187201
} & ThisType<void>,
188202
): DefineVaporComponent<
189203
RuntimePropsOptions,
@@ -193,6 +207,7 @@ export function defineVaporComponent<
193207
Slots,
194208
Exposed extends Block ? Record<string, any> : Exposed,
195209
TypeRefs,
210+
TypeEl,
196211
// MakeDefaultsOptional - if TypeProps is provided, set to false to use
197212
// user props types verbatim
198213
unknown extends TypeProps ? true : false,

packages/runtime-vapor/src/component.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export interface ObjectVaporComponent<
101101
RuntimeEmitsKeys extends string = string,
102102
Slots extends StaticSlots = StaticSlots,
103103
Exposed extends Record<string, any> = Record<string, any>,
104+
TypeEl extends Block = Block,
104105
InferredProps = ComponentObjectPropsOptions extends Props
105106
? {}
106107
: ExtractPropTypes<Props>,
@@ -117,7 +118,7 @@ export interface ObjectVaporComponent<
117118
emit: EmitFn<Emits>,
118119
attrs: any,
119120
slots: StaticSlots,
120-
): RenderReturn
121+
): RenderReturn<TypeEl>
121122

122123
name?: string
123124
vapor?: boolean
@@ -362,6 +363,7 @@ export class VaporComponentInstance<
362363
Emits extends EmitsOptions = {},
363364
Slots extends StaticSlots = StaticSlots,
364365
Exposed extends Record<string, any> = Record<string, any>,
366+
TypeEl extends Block = Block,
365367
Refs extends Record<string, any> = Record<string, any>,
366368
> implements GenericComponentInstance
367369
{
@@ -372,7 +374,7 @@ export class VaporComponentInstance<
372374
parent: GenericComponentInstance | null
373375
appContext: GenericAppContext
374376

375-
block: Block
377+
block: TypeEl
376378
scope: EffectScope
377379

378380
rawProps: RawProps

0 commit comments

Comments
 (0)