Skip to content

Commit b2d6b6c

Browse files
Zclhlmgqzciwusong
authored andcommitted
fix(types): preserve and expose original options on defineComponent return type (vuejs#5416)
fix vuejs#3796
1 parent be3bd0b commit b2d6b6c

File tree

5 files changed

+242
-156
lines changed

5 files changed

+242
-156
lines changed

packages/runtime-core/src/apiAsyncComponent.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export function defineAsyncComponent<
111111
)
112112
}
113113

114-
return defineComponent({
114+
return defineComponent<{}>({
115115
name: 'AsyncComponentWrapper',
116116

117117
__asyncLoader: load,

packages/runtime-core/src/apiDefineComponent.ts

+99-56
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
ComponentOptionsWithObjectProps,
77
ComponentOptionsMixin,
88
RenderFunction,
9-
ComponentOptionsBase
9+
ComponentOptionsBase,
10+
ComponentProvideOptions
1011
} from './componentOptions'
1112
import {
1213
SetupContext,
@@ -40,6 +41,8 @@ export type DefineComponent<
4041
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
4142
E extends EmitsOptions = {},
4243
EE extends string = string,
44+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
45+
RawOptions extends {} = {},
4346
PP = PublicProps,
4447
Props = Readonly<
4548
PropsOrPropOptions extends ComponentPropsOptions
@@ -48,22 +51,23 @@ export type DefineComponent<
4851
> &
4952
({} extends E ? {} : EmitsToProps<E>),
5053
Defaults = ExtractDefaultPropTypes<PropsOrPropOptions>
51-
> = ComponentPublicInstanceConstructor<
52-
CreateComponentPublicInstance<
53-
Props,
54-
RawBindings,
55-
D,
56-
C,
57-
M,
58-
Mixin,
59-
Extends,
60-
E,
61-
PP & Props,
62-
Defaults,
63-
true
54+
> = RawOptions &
55+
ComponentPublicInstanceConstructor<
56+
CreateComponentPublicInstance<
57+
Props,
58+
RawBindings,
59+
D,
60+
C,
61+
M,
62+
Mixin,
63+
Extends,
64+
E,
65+
PP & Props,
66+
Defaults,
67+
true
68+
> &
69+
Props
6470
> &
65-
Props
66-
> &
6771
ComponentOptionsBase<
6872
Props,
6973
RawBindings,
@@ -74,7 +78,8 @@ export type DefineComponent<
7478
Extends,
7579
E,
7680
EE,
77-
Defaults
81+
Defaults,
82+
Provide
7883
> &
7984
PP
8085

@@ -104,20 +109,36 @@ export function defineComponent<
104109
Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
105110
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
106111
E extends EmitsOptions = EmitsOptions,
107-
EE extends string = string
112+
EE extends string = string,
113+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
114+
Options extends {} = {}
108115
>(
109-
options: ComponentOptionsWithoutProps<
110-
Props,
111-
RawBindings,
112-
D,
113-
C,
114-
M,
115-
Mixin,
116-
Extends,
117-
E,
118-
EE
119-
>
120-
): DefineComponent<Props, RawBindings, D, C, M, Mixin, Extends, E, EE>
116+
options: Options &
117+
ComponentOptionsWithoutProps<
118+
Props,
119+
RawBindings,
120+
D,
121+
C,
122+
M,
123+
Mixin,
124+
Extends,
125+
E,
126+
EE,
127+
Provide
128+
>
129+
): DefineComponent<
130+
Props,
131+
RawBindings,
132+
D,
133+
C,
134+
M,
135+
Mixin,
136+
Extends,
137+
E,
138+
EE,
139+
Provide,
140+
Options
141+
>
121142

122143
// overload 3: object format with array props declaration
123144
// props inferred as { [key in PropNames]?: any }
@@ -131,19 +152,23 @@ export function defineComponent<
131152
Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
132153
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
133154
E extends EmitsOptions = Record<string, any>,
134-
EE extends string = string
155+
EE extends string = string,
156+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
157+
Options extends {} = {}
135158
>(
136-
options: ComponentOptionsWithArrayProps<
137-
PropNames,
138-
RawBindings,
139-
D,
140-
C,
141-
M,
142-
Mixin,
143-
Extends,
144-
E,
145-
EE
146-
>
159+
options: Options &
160+
ComponentOptionsWithArrayProps<
161+
PropNames,
162+
RawBindings,
163+
D,
164+
C,
165+
M,
166+
Mixin,
167+
Extends,
168+
E,
169+
EE,
170+
Provide
171+
>
147172
): DefineComponent<
148173
Readonly<{ [key in PropNames]?: any }>,
149174
RawBindings,
@@ -153,7 +178,9 @@ export function defineComponent<
153178
Mixin,
154179
Extends,
155180
E,
156-
EE
181+
EE,
182+
Provide,
183+
Options
157184
>
158185

159186
// overload 4: object format with object props declaration
@@ -169,20 +196,36 @@ export function defineComponent<
169196
Mixin extends ComponentOptionsMixin = ComponentOptionsMixin,
170197
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
171198
E extends EmitsOptions = Record<string, any>,
172-
EE extends string = string
199+
EE extends string = string,
200+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
201+
Options extends {} = {}
173202
>(
174-
options: ComponentOptionsWithObjectProps<
175-
PropsOptions,
176-
RawBindings,
177-
D,
178-
C,
179-
M,
180-
Mixin,
181-
Extends,
182-
E,
183-
EE
184-
>
185-
): DefineComponent<PropsOptions, RawBindings, D, C, M, Mixin, Extends, E, EE>
203+
options: Options &
204+
ComponentOptionsWithObjectProps<
205+
PropsOptions,
206+
RawBindings,
207+
D,
208+
C,
209+
M,
210+
Mixin,
211+
Extends,
212+
E,
213+
EE,
214+
Provide
215+
>
216+
): DefineComponent<
217+
PropsOptions,
218+
RawBindings,
219+
D,
220+
C,
221+
M,
222+
Mixin,
223+
Extends,
224+
E,
225+
EE,
226+
Provide,
227+
Options
228+
>
186229

187230
// implementation, close to no-op
188231
export function defineComponent(options: unknown) {

packages/runtime-core/src/componentOptions.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ export interface ComponentOptionsBase<
117117
Extends extends ComponentOptionsMixin,
118118
E extends EmitsOptions,
119119
EE extends string = string,
120-
Defaults = {}
121-
> extends LegacyOptions<Props, D, C, M, Mixin, Extends>,
120+
Defaults = {},
121+
Provide extends ComponentProvideOptions = ComponentProvideOptions
122+
> extends LegacyOptions<Props, D, C, M, Mixin, Extends, Provide>,
122123
ComponentInternalOptions,
123124
ComponentCustomOptions {
124125
setup?: (
@@ -224,6 +225,7 @@ export type ComponentOptionsWithoutProps<
224225
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
225226
E extends EmitsOptions = EmitsOptions,
226227
EE extends string = string,
228+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
227229
PE = Props & EmitsToProps<E>
228230
> = ComponentOptionsBase<
229231
PE,
@@ -235,7 +237,8 @@ export type ComponentOptionsWithoutProps<
235237
Extends,
236238
E,
237239
EE,
238-
{}
240+
{},
241+
Provide
239242
> & {
240243
props?: undefined
241244
} & ThisType<
@@ -252,6 +255,7 @@ export type ComponentOptionsWithArrayProps<
252255
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
253256
E extends EmitsOptions = EmitsOptions,
254257
EE extends string = string,
258+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
255259
Props = Readonly<{ [key in PropNames]?: any }> & EmitsToProps<E>
256260
> = ComponentOptionsBase<
257261
Props,
@@ -263,7 +267,8 @@ export type ComponentOptionsWithArrayProps<
263267
Extends,
264268
E,
265269
EE,
266-
{}
270+
{},
271+
Provide
267272
> & {
268273
props: PropNames[]
269274
} & ThisType<
@@ -289,6 +294,7 @@ export type ComponentOptionsWithObjectProps<
289294
Extends extends ComponentOptionsMixin = ComponentOptionsMixin,
290295
E extends EmitsOptions = EmitsOptions,
291296
EE extends string = string,
297+
Provide extends ComponentProvideOptions = ComponentProvideOptions,
292298
Props = Readonly<ExtractPropTypes<PropsOptions>> & EmitsToProps<E>,
293299
Defaults = ExtractDefaultPropTypes<PropsOptions>
294300
> = ComponentOptionsBase<
@@ -301,7 +307,8 @@ export type ComponentOptionsWithObjectProps<
301307
Extends,
302308
E,
303309
EE,
304-
Defaults
310+
Defaults,
311+
Provide
305312
> & {
306313
props: PropsOptions & ThisType<void>
307314
} & ThisType<
@@ -384,6 +391,10 @@ type ComponentWatchOptionItem = WatchOptionItem | WatchOptionItem[]
384391

385392
type ComponentWatchOptions = Record<string, ComponentWatchOptionItem>
386393

394+
export type ComponentProvideOptions = ObjectProvideOptions | Function
395+
396+
type ObjectProvideOptions = Record<string | symbol, unknown>
397+
387398
type ComponentInjectOptions = string[] | ObjectInjectOptions
388399

389400
type ObjectInjectOptions = Record<
@@ -397,7 +408,8 @@ interface LegacyOptions<
397408
C extends ComputedOptions,
398409
M extends MethodOptions,
399410
Mixin extends ComponentOptionsMixin,
400-
Extends extends ComponentOptionsMixin
411+
Extends extends ComponentOptionsMixin,
412+
Provide extends ComponentProvideOptions = ComponentProvideOptions
401413
> {
402414
compatConfig?: CompatConfig
403415

@@ -431,7 +443,7 @@ interface LegacyOptions<
431443
computed?: C
432444
methods?: M
433445
watch?: ComponentWatchOptions
434-
provide?: Data | Function
446+
provide?: Provide
435447
inject?: ComponentInjectOptions
436448

437449
// assets

packages/runtime-core/src/componentPublicInstance.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ import {
3434
OptionTypesKeys,
3535
resolveMergedOptions,
3636
shouldCacheAccess,
37-
MergedComponentOptionsOverride
37+
MergedComponentOptionsOverride,
38+
ComponentProvideOptions
3839
} from './componentOptions'
3940
import { EmitsOptions, EmitFn } from './componentEmits'
4041
import { Slots } from './componentSlots'
@@ -150,7 +151,8 @@ export type CreateComponentPublicInstance<
150151
PublicM extends MethodOptions = UnwrapMixinsType<PublicMixin, 'M'> &
151152
EnsureNonVoid<M>,
152153
PublicDefaults = UnwrapMixinsType<PublicMixin, 'Defaults'> &
153-
EnsureNonVoid<Defaults>
154+
EnsureNonVoid<Defaults>,
155+
Provide extends ComponentProvideOptions = ComponentProvideOptions
154156
> = ComponentPublicInstance<
155157
PublicP,
156158
PublicB,
@@ -161,7 +163,19 @@ export type CreateComponentPublicInstance<
161163
PublicProps,
162164
PublicDefaults,
163165
MakeDefaultsOptional,
164-
ComponentOptionsBase<P, B, D, C, M, Mixin, Extends, E, string, Defaults>
166+
ComponentOptionsBase<
167+
P,
168+
B,
169+
D,
170+
C,
171+
M,
172+
Mixin,
173+
Extends,
174+
E,
175+
string,
176+
Defaults,
177+
Provide
178+
>
165179
>
166180

167181
// public properties exposed on the proxy, which is used as the render context

0 commit comments

Comments
 (0)